从我的Android日历删除定期事件的只有一个实例(Delete only one instance

2019-06-24 05:03发布

我一直在寻找通过关于如何从我的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。 我的问题是,我只是想删除定期事件的一个实例,但是这个代码删除所有事件。 有没有办法只删除一个实例? 谢谢。

Answer 1:

下面是一些最基础

  1. 找到你要删除的实例。 (使用Instances.query()
  2. 创建例外URI与事件ID 所附 。
  3. 创建ContentValues 。 把你的实例的BEGIN值... Events.ORIGINAL_INSTANCE_TIME 。 把STATUS_CANCELED为... Events.STATUS
  4. 现在只有插入(yourURI,yourValues) ,这就是它!


Answer 2:

如果其他人是否仍然为此而努力,我终于解决了!

事实证明,你不删除或修改任何记录,你实际做的是插入一个新的事件称为异常。 我花了几个月的时间在任何地方找到这些信息,甚至已经找到了,再过几个月制定出什么需要被放入例外,使其工作,所以这里是我做到了。

首先,查询要取消一个发生事件的实际情况。 您需要查询表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的时刻,一旦时钟更改此代码将无法正常工作,但我会担心的时候!

最后,我用所谓内容提供商助手来帮我找到这个应用程序。 你可以用它查询您的内容提供商的表。 我会尝试使用我的代码设置一个例外,然后用我的手机日历应用程序来删除该实例,并比较两个记录。



Answer 3:

你将不得不更新EXDATE原始事件的列。



文章来源: Delete only one instance of a recurring event from my Android calendar