【发布时间】:2017-03-28 02:15:56
【问题描述】:
我通过 API 调用从服务器获取(一周的)事件列表,我的应用需要将它们同步到设备中的日历。可以在服务器上更新或删除事件,而无需来自应用程序的任何交互。而且我需要在每次刷新屏幕时将它们同步到日历。
为了使我的日历上的活动与我的服务器保持同步,我在刷新时执行了以下操作:
- 从日历中删除给定一周的所有事件。
-
然后插入我从服务器获取的事件。
public static void deleteAllEventsInWeekOfCalendar(Activity activity, int calId, long weekStartTimeMillis, long weekEndTimeMillis) { try { Uri eventUri = Uri.parse("content://com.android.calendar/events"); String[] projection = new String[]{Events._ID, Events.TITLE, Events.DTSTART, Events.DESCRIPTION}; String whereClause = Events.CALENDAR_ID + "=" + calId + " AND " + Events.DTSTART + " >= " + weekStartTimeMillis + " AND " + Events.DTSTART + " <= " + weekEndTimeMillis + " AND " + Events.DESCRIPTION + " LIKE '% Added by MyApp'"; Cursor cursor = activity.getContentResolver().query(eventUri, projection, whereClause, null, Events.DTSTART); if (cursor != null && cursor.moveToFirst()) { Log.v("HowMany", cursor.getCount() + " matching events Found"); int numOfDeleted = 0; do { try { String event_id = cursor.getString(cursor.getColumnIndexOrThrow(projection[0])); int numOfRowsDeleted = activity.getContentResolver().delete(ContentUris.withAppendedId(eventUri, Long.parseLong(event_id)), null, null); if (numOfRowsDeleted == 1) { ++numOfDeleted; } } catch (Exception e) { e.printStackTrace(); } } while (cursor.moveToNext()); cursor.close(); Log.v("HowMany", numOfDeleted + " deleted"); } } catch (Exception e) { e.printStackTrace(); } }
这是我将所有事件插入日历的代码:
public static void doAddCalendarEvent(MyEvent myEvent, Activity activity, int calendarId) {
try {
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
return;
}
String desc = myEvent.getDesc();
desc += "\n\n Added by MyApp";
ContentResolver cr = activity.getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, myEvent.getEventStartTime());
values.put(Events.DTEND, myEvent.getEventEndTime());
values.put(Events.TITLE, myEvent.getTitle());
values.put(Events.DESCRIPTION, desc);
values.put(Events.CALENDAR_ID, calendarId);
values.put(Events.EVENT_LOCATION, myEvent.getLocation());
values.put(Events.STATUS, Events.STATUS_CONFIRMED);
values.put(Events.AVAILABILITY, Events.AVAILABILITY_BUSY);
if (hasAlarm) {
values.put(Events.HAS_ALARM, true);
}
values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
long eventId = 0;
Uri uri = cr.insert(Events.CONTENT_URI, values);
if (uri != null) {
eventId = Long.parseLong(uri.getLastPathSegment());
Log.v(TAG, "INSERTED EVENT ID=>" + eventId + "--->" + startDate);
}
if (hasAlarm) {
setReminder(cr, reminderValue, eventId);
}
} catch (Exception e) {
e.printStackTrace();
}
}
问题:有时事件在日历上重复。如何避免重复?我哪里错了?请建议。
【问题讨论】:
标签: android android-calendar android-contentresolver