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

Я пытаюсь сделать мое приложение добавить напоминания в календаре пользователя. Код ищет 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-planner)

3 ответов


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

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

AND (deleted != 1)

в строке выбора становится

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

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

p.s: попробуйте использовать этот инструмент -- 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.


вы также можете сделать что-то вроде этого:

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;
}

Она работает на всех устройствах.