如果其他人仍在为此苦苦挣扎,我终于破解了!
事实证明,您没有删除或修改任何记录,您实际上所做的是插入一个称为异常的新事件。我花了几个月的时间在任何地方找到这些信息,即使找到了,又花了几个月的时间来弄清楚需要在异常中添加什么才能使其正常工作,所以这就是我的做法。
首先,查询要取消一次发生的事件的实际实例。您需要查询表 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 的应用程序来帮助我解决这个问题。您可以使用它查询您的内容提供程序表。我会尝试使用我的代码设置异常,然后使用我的手机日历应用程序删除实例,并比较两条记录。