更新 Android 个日历事件
Update Android calendar events
我正在尝试以编程方式更新日历事件,但我遇到了一些问题。
我正在使用来自 Google Android 文档的更新代码:https://developer.android.com/guide/topics/providers/calendar-provider.html#update-event
所以这是我的代码:
ContentValues values = new ContentValues();
Uri updateUri = null;
// New end for event
values.put(CalendarContract.Events.DTEND, endMillis);
updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID);
int rows = c.getContentResolver().update(updateUri, values, null, null);
Log.i("DEBUG_TAG", "Rows updated: " + rows);
但是行变量总是 returns 0 除非我进入应用程序设置,删除日历存储,添加新日历和新事件,然后当我尝试更新它时,它只工作一次。如果我尝试添加另一个事件并在之后更新它,行 return 0 再次。
有什么想法吗?
谢谢
请注意,我的应用最低 API 级别 17(在该级别上它不起作用)但我尝试了 API 级别 25 并且它可以运行,所以你知道如何为我的代码添加对以前 Android 版本的支持?我还发现,经过一些测试,它可以从 API 级别 21 开始工作。在下面,它不会。
编辑:
我找到了解决方案,请查看下面的答案。
这是对我有用的解决方案:
我使用的 eventID 是 CalendarContract.Events._ID
列的查询结果,但我不得不使用 CalendarContract.Instances.EVENT_ID
提供的 ID。
事实上,如果我创建一个新事件(第一个事件),它有 _id = 1 和 event_id = 1,如果我从 Android 日历应用程序中删除它并用我的应用程序创建一个新事件,它也有 _id = 1 但 event_id = 2。
因此,如果我使用 _id 而不是 event_id 和 withAppendedID()
.
,更新查询将失败
这是对我有用的代码。 startMillis
和 endMillis
分别是您的会议开始时间和结束时间(以毫秒为单位)。
Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI
.buildUpon();
ContentUris.appendId(eventsUriBuilder, startMillis);
ContentUris.appendId(eventsUriBuilder, endMillis);
Uri eventsUri = eventsUriBuilder.build();
String[] column = {CalendarContract.Instances.EVENT_ID, CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND, CalendarContract.Events.TITLE};
Cursor cursor;
cursor = c.getContentResolver().query(eventsUri, column, CalendarContract.Events.CALENDAR_ID+"="+Constant.ID_CALENDAR, null, CalendarContract.Instances.DTSTART + " ASC");
if (cursor.moveToFirst()) {
do {
uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI,cursor.getLong(0));
} while (cursor.moveToNext());
}
cursor.close();
c.getContentResolver().delete(uri, null, null);
我正在尝试以编程方式更新日历事件,但我遇到了一些问题。
我正在使用来自 Google Android 文档的更新代码:https://developer.android.com/guide/topics/providers/calendar-provider.html#update-event
所以这是我的代码:
ContentValues values = new ContentValues();
Uri updateUri = null;
// New end for event
values.put(CalendarContract.Events.DTEND, endMillis);
updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID);
int rows = c.getContentResolver().update(updateUri, values, null, null);
Log.i("DEBUG_TAG", "Rows updated: " + rows);
但是行变量总是 returns 0 除非我进入应用程序设置,删除日历存储,添加新日历和新事件,然后当我尝试更新它时,它只工作一次。如果我尝试添加另一个事件并在之后更新它,行 return 0 再次。
有什么想法吗?
谢谢
请注意,我的应用最低 API 级别 17(在该级别上它不起作用)但我尝试了 API 级别 25 并且它可以运行,所以你知道如何为我的代码添加对以前 Android 版本的支持?我还发现,经过一些测试,它可以从 API 级别 21 开始工作。在下面,它不会。
编辑: 我找到了解决方案,请查看下面的答案。
这是对我有用的解决方案:
我使用的 eventID 是 CalendarContract.Events._ID
列的查询结果,但我不得不使用 CalendarContract.Instances.EVENT_ID
提供的 ID。
事实上,如果我创建一个新事件(第一个事件),它有 _id = 1 和 event_id = 1,如果我从 Android 日历应用程序中删除它并用我的应用程序创建一个新事件,它也有 _id = 1 但 event_id = 2。
因此,如果我使用 _id 而不是 event_id 和 withAppendedID()
.
这是对我有用的代码。 startMillis
和 endMillis
分别是您的会议开始时间和结束时间(以毫秒为单位)。
Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI
.buildUpon();
ContentUris.appendId(eventsUriBuilder, startMillis);
ContentUris.appendId(eventsUriBuilder, endMillis);
Uri eventsUri = eventsUriBuilder.build();
String[] column = {CalendarContract.Instances.EVENT_ID, CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND, CalendarContract.Events.TITLE};
Cursor cursor;
cursor = c.getContentResolver().query(eventsUri, column, CalendarContract.Events.CALENDAR_ID+"="+Constant.ID_CALENDAR, null, CalendarContract.Instances.DTSTART + " ASC");
if (cursor.moveToFirst()) {
do {
uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI,cursor.getLong(0));
} while (cursor.moveToNext());
}
cursor.close();
c.getContentResolver().delete(uri, null, null);