サーバーからAPI呼び出しまでの(週の)イベントのリストを取得し、私のアプリケーションはそれらをデバイスのカレンダーに同期させる必要があります。イベントは、アプリケーションからのインタラクションなしで、サーバー上で更新または削除することができます。そして、画面の更新時にカレンダーに同期する必要があります。私のサーバーを最新の状態にカレンダー上の私のイベントを作るためにAndroidカレンダーでイベントが重複しないようにするにはどうすればよいですか?
、私はリフレッシュに次の操作を実行している:
- はカレンダーから特定の週のすべてのイベントを削除します。
次に、サーバーから取得したイベントを挿入します。
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();
}
}
問題:時々イベントがカレンダーに複製されています。重複を避けるにはどうすればいいですか?どこが間違っているの?提案してください。