Android日历提供商:如何删除自己的本地日历?

时间:2014-07-21 13:43:24

标签: android android-calendar

我正在学习如何使用Android日历。到目前为止,我能够显示有关现有日历的信息。我也可以创建自己的本地日历 - 测试代码如:

private void createCalendarTest()
{
    Uri.Builder builder = Calendars.CONTENT_URI.buildUpon();
    builder.appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER, "true")
           .appendQueryParameter(Calendars.ACCOUNT_NAME, "private")
           .appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);

    Uri uri = builder.build();

    ContentValues values = new ContentValues();
    values.put(Calendars.NAME, "TEST");
    values.put(Calendars.CALENDAR_DISPLAY_NAME, "Calendar named TEST");
    values.put(Calendars.SYNC_EVENTS, false);
    values.put(Calendars.VISIBLE, true);

    getContentResolver().insert(uri, values);
}

实际上,我可以制作许多仅在_ID中有所不同的日历。我在别处读过,我只能在使用同步适配器时创建日历。现在,我该如何删除日历?我希望URI还必须包含同步适配器信息和已删除日历的_ID。我尝试了以下代码,但是我没有成功:

private void deleteCalendarTest()
{
    Uri.Builder builder = Calendars.CONTENT_URI.buildUpon();
    builder.appendPath("6")   // here for testing; I know the calender has this ID
           .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER, "true")
           .appendQueryParameter(Calendars.ACCOUNT_NAME, "private")
           .appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);

    Uri uri = builder.build();

    getContentResolver().delete(uri, null, null);
    Toast.makeText(this, "??? deleteCalendarTest() not working", Toast.LENGTH_SHORT).show();
}

我该如何解决?

3 个答案:

答案 0 :(得分:4)

在阅读了更多关注文档后,我发现你应该在内容值中添加以下字段:

values.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
values.put(CalendarContract.Calendars.ACCOUNT_NAME, "private");
values.put(CalendarContract.Calendars.ACCOUNT_TYPE,CalendarContract.ACCOUNT_TYPE_LOCAL);

然后其他一切都应该没问题,您应该可以删除插入的日历! ;)

答案 1 :(得分:0)

“andrea-rinaldi”是对的。以下代码片段对我有用。 “calendarHandler”是辅助类的一个实例,它扩展了AsyncQueryHandler,即用于创建日历的那个。

Uri calUri = CalendarContract.Calendars.CONTENT_URI;
calUri = calUri.buildUpon()
            .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, BuildConfig.APPLICATION_ID)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL)
            .build();
calendarHandler.startDelete(0,-1,calUri,null,null);

答案 2 :(得分:0)

此Kotlin解决方案为我工作:

val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toLong())

contentResolver.delete(uri, null, null)

我正在使用该应用程序(而不是SyncAdapter)删除日历,因此无需附加任何查询参数。只需将日历的ID附加到内容uri,然后使用ContentResolver删除日历即可。