从我的Android日历中仅删除一个定期事件的一个实例

时间:2012-05-05 13:01:29

标签: android calendar

我一直在查看有关如何从我的Android 2.3手机日历中删除一个重复活动的一个实例的各种帖子,但我找不到完美的答案。到目前为止,我遇到的最好的是:

Uri eventsUri = Uri.parse("content://com.android.calendar/events");
Uri deleteEventUri = Uri.withAppendedPath(eventsUri, String.valueOf(id2));
DeleteEventActivity.context.getContentResolver().delete(deleteEventUri, null, null);

其中id2是我要删除的事件的id。我遇到的问题是我只想删除一个重复事件的一个实例,但是这段代码会删除所有出现的事件。有没有办法只删除一个实例?感谢。

3 个答案:

答案 0 :(得分:6)

如果还有其他人仍在努力解决这个问题,我终于破解了它!

事实证明,您不删除或修改任何记录,您实际执行的操作是插入一个称为异常的新事件。我花了几个月的时间在任何地方找到这些信息,甚至找到了它,再过几个月才能确定需要在异常中使用的内容才能使它工作,所以我就是这样做的。

首先,查询要取消一次事件的事件的实际实例。您需要查询表CalendarContract.Instances以获取CalendarContract.Instances.TITLE的值, CalendarContract.Instances.BEGIN和CalendarContract.Instances.EVENT_ID。我在我的代码中这样做的方式并不真正适合这个答案的上下文,所以希望你能够自己解决如何做到这一点。将这些值存储为:

final String title = eventCursor.getString(0); final long beginl=eventCursor.getLong(1); final int id = eventCursor.getInt(2);

然后我们需要按如下方式设置一个新事件:

 final Context context = getApplicationContext();
 final ContentResolver contentResolver = context.getContentResolver();
 final Uri.Builder builder = Uri.parse(
"content://com.android.calendar/events").buildUpon();
 final Cursor eventCursor = contentResolver.query(builder.build(),
new String[] 
   {Events.CALENDAR_TIME_ZONE,Events.ALL_DAY,Events.CALENDAR_ID,Events._SYNC_ID,     Events.OWNER_ACCOUNT }, 
   "_id=" + id, null, null);
 while (eventCursor.moveToNext()) {
final String timezone=eventCursor.getString(0);
final String allday=eventCursor.getString(1);
final long calID=eventCursor.getLong(2);
final String mSyncId=eventCursor.getString(3);
final String account=eventCursor.getString(4);
ContentValues values = new ContentValues();
    values.put(Events.TITLE, title);
    values.put(Events.EVENT_TIMEZONE, timezone);
values.put(Events.ORIGINAL_SYNC_ID, mSyncId);//not 100% sure about this,may also need a date?
values.put(Events.HAS_ALARM, "0");
values.put(Events.HAS_ATTENDEE_DATA,"0");
values.put(Events.ALL_DAY, allday);
    values.put(Events.DTSTART, beginl+3600000);
    values.put(Events.ORIGINAL_INSTANCE_TIME, beginl+3600000);
values.put(Events.STATUS, Events.STATUS_CANCELED);
Uri uri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI,
        String.valueOf(id));
uri = asSyncAdapter(uri, account, CTS_TEST_TYPE);
Uri resultUri = context.getContentResolver().insert(uri, values);
    try {
        int eventID = Integer.parseInt(resultUri.getLastPathSegment()); 
        int debug=eventID;
        } catch (Exception e) {
        int debug=0;
        }
}
static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()  
    .appendQueryParameter
        (android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
    .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
    .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}

希望这有效,我试图删除不相关的代码部分。您需要注意我必须将3600000添加到beginl值(1小时,以毫秒为单位)。我认为这是因为我们现在处于BST状态,并且一旦时钟发生变化,这段代码将无效,但我当时会担心这一点!

最后,我使用了一个名为Content Provider Helper的应用来帮助我找到它。您可以使用它查询您的内容提供者表。我会尝试使用我的代码设置异常,然后使用我的手机日历应用删除实例,并比较两个记录。

答案 1 :(得分:6)

以下是基础知识

  1. 找到要删除的实例。 (使用Instances.query()
  2. 使用事件ID exception URI创建appended
  3. 创建ContentValues。将实例的BEGIN值设为...Events.ORIGINAL_INSTANCE_TIME。将STATUS_CANCELED设为...Events.STATUS
  4. 现在只有insert(yourURI, yourValues)而且就是这样!

答案 2 :(得分:1)

您必须更新原始活动的EXDATE 列。