Удаление событий из Календаря, которые не удаляются
Я пытаюсь добавить свое приложение в календарь пользователя. Код выполняет поиск 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);
}
Почему события все еще присутствуют после их удаления из приложения Календаря и почему я не могу удалить его даже программно?
Обновление
Проблема заключается только в том, что я использую calendar_id=1
для вставки и удаления. Другие calendar_id
работают нормально.
Обновление 2
Я тестировал код на Samsung Galaxy S1, и он работает нормально. Кажется, проблема в Samsung Galaxy S3 (где у меня есть моя проблема, я думаю, что это ошибка в S-планировщике)
Ответы
Ответ 1
Если это не проблема с 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", что указывает на то, что они будут удалены в ближайшее время. Причина задержки, возможно, календарь ожидает синхронизации.
p.s: попробуйте использовать этот инструмент - http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx для визуализации календаря. Проверьте столбцы "удаленные" и "грязные" в db
Ответ 2
Различные версии 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.
Ответ 3
Вы также можете сделать что-то вроде этого:
private boolean isEventInCal(Context context, String id) {
Uri event = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, Long.parseLong(id));
Cursor cursor = context.getContentResolver().query(event, null, null, null, null);
if (cursor != null && cursor.getCount() == 1) {
//the event exists?
if (cursor.moveToFirst() && !TextUtils.equals(cursor.getString(cursor.getColumnIndex("deleted")), "1")) {
cursor.close();
return true;
} else {
return false;
}
}
return false;
}
Он работает на всех устройствах.