【问题标题】:Delete only one instance of a recurring event from my Android calendar从我的 Android 日历中仅删除一个重复事件的实例
【发布时间】:2017-04-25 19:14:09
【问题描述】:

我一直在浏览有关如何从我的 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。我遇到的问题是我只想删除重复事件的一个实例,但是此代码会删除所有事件。有没有办法只删除一个实例?谢谢。

【问题讨论】:

  • 你找到解决办法了吗?

标签: android calendar


【解决方案1】:

这里是基础知识

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

【讨论】:

    【解决方案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 中,一旦时钟发生变化,此代码将无法工作,但当时我会担心的!

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

    【讨论】:

      【解决方案3】:

      您必须更新原始事件的EXDATE 列。

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多