Удаление событий из Календаря, которые не удаляются

Я пытаюсь сделать свое приложение добавлением напоминаний в календарь пользователя. Код ищет title и start date чтобы проверить, существует ли событие в календаре перед его добавлением (чтобы не было дубликатов). Моя проблема в том, что: если я удалю событие из Календаря вручную (используя Календарь), событие исчезнет из Календаря (я просматриваю все мои календари и не вижу его в приложении календаря), но не из базы данных. Еще одна вещь, которую я не понимаю, – это то, что я пытался программно удалить события, но все же они не удаляются.

Вот мой фрагмент кода:

 Cursor cur = null; ContentResolver cr = getContentResolver(); String calUriString = "content://com.android.calendar/events"; Uri cal=Uri.parse(calUriString); String[] EVENT_PROJECTION=new String[]{"calendar_id","title","dtstart","_id"}; String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE '"+name+"') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+"))"; cur = cr.query(cal, EVENT_PROJECTION, selection, null, null); boolean found=false; if(cur!=null) if(cur.moveToFirst()){ DatabaseUtils.dumpCursor(cur);/*Just to view my results (which always include the deleted events)*/ do{ if(cur.getString(1).equals(name)){ /*I use this part to try to remove the events manually*/ Uri eventUri =ContentUris.withAppendedId(cal, Long.valueOf(cur.getString(3))); String reminderUriString = "content://com.android.calendar/reminders"; Uri remUri =Uri.parse(reminderUriString); cr.delete(remUri, "event_id="+cur.getString(3), null); cr.delete(eventUri, null, null); /*It is not working also*/ Toast.makeText(getApplicationContext(), "Event already exists in Calendar", Toast.LENGTH_LONG).show(); found=true; //break; } }while(cur.moveToNext()); } cur.close(); if(found){ /*Event is found even if I remove it from the Calendar manually and even if I remove it programmatically using cr.delete()*/ } else{ values.put("calendar_id",1); /*I am using the same Calendar that I query, or is this wrong*/ values.put("title", name); /*More values are added*/ Uri calendarUri = cr.insert(cal, values); long eventID = Long.parseLong(calendarUri.getLastPathSegment()); String reminderUriString = "content://com.android.calendar/reminders"; ContentValues reminderValues = new ContentValues(); reminderValues.put("event_id", eventID); reminderValues.put("minutes", 5); reminderValues.put("method", 1); Uri reminderUri = getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues); } в Cursor cur = null; ContentResolver cr = getContentResolver(); String calUriString = "content://com.android.calendar/events"; Uri cal=Uri.parse(calUriString); String[] EVENT_PROJECTION=new String[]{"calendar_id","title","dtstart","_id"}; String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE '"+name+"') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+"))"; cur = cr.query(cal, EVENT_PROJECTION, selection, null, null); boolean found=false; if(cur!=null) if(cur.moveToFirst()){ DatabaseUtils.dumpCursor(cur);/*Just to view my results (which always include the deleted events)*/ do{ if(cur.getString(1).equals(name)){ /*I use this part to try to remove the events manually*/ Uri eventUri =ContentUris.withAppendedId(cal, Long.valueOf(cur.getString(3))); String reminderUriString = "content://com.android.calendar/reminders"; Uri remUri =Uri.parse(reminderUriString); cr.delete(remUri, "event_id="+cur.getString(3), null); cr.delete(eventUri, null, null); /*It is not working also*/ Toast.makeText(getApplicationContext(), "Event already exists in Calendar", Toast.LENGTH_LONG).show(); found=true; //break; } }while(cur.moveToNext()); } cur.close(); if(found){ /*Event is found even if I remove it from the Calendar manually and even if I remove it programmatically using cr.delete()*/ } else{ values.put("calendar_id",1); /*I am using the same Calendar that I query, or is this wrong*/ values.put("title", name); /*More values are added*/ Uri calendarUri = cr.insert(cal, values); long eventID = Long.parseLong(calendarUri.getLastPathSegment()); String reminderUriString = "content://com.android.calendar/reminders"; ContentValues reminderValues = new ContentValues(); reminderValues.put("event_id", eventID); reminderValues.put("minutes", 5); reminderValues.put("method", 1); Uri reminderUri = getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues); } 

Почему события все еще присутствуют после их удаления из приложения календаря и почему я не могу удалить его даже программно?

Обновление Проблема заключается только в том, что я использую calendar_id=1 для вставки и удаления. Другие функции calendar_id работают нормально.

Обновление 2 Я тестировал код на Samsung Galaxy S1, и он работает нормально. Кажется, проблема в Samsung Galaxy S3 (где у меня есть моя проблема, я думаю, что это ошибка в S-планировщике)

Если это не проблема URI,

Можете ли вы попытаться включить в строку выбора

 AND (deleted != 1) 

Поэтому строка выбора становится,

 String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE '"+name+"') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+") AND ( deleted != 1 ) )"; 

Иногда CalendarDB занимает время для удаления событий. Но «удаленный» COLUMN будет отмечен как «1», что означает, что они будут удалены в ближайшее время. Причина задержки, возможно, календарь ожидает синхронизации.

Ps: Попробуйте использовать этот инструмент – http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx, чтобы визуализировать базу данных календаря. Проверьте столбцы «удаленные» и «грязные» в db

Различные версии android используют разные пути URI для поиска данных календаря. Например, вы можете использовать следующие константы для Android 2.1 и 2.2:

 private static final String URI_VERSION_2_1 = "content://calendar/events"; private static final String URI_VERSION_2_2 = "content://com.android.calendar/events"; 

В 4.0 предпочтительным является другой метод:

http://android-developers.blogspot.com/2011/10/ics-and-non-public-apis.html http://developer.android.com/reference/android/provider/CalendarContract.Events.html

Существует хорошая вероятность того, что у Galaxy S3 есть хотя бы Android 4.0. Это изменение может учитывать код, работающий на S1, но не S3.