Вот как я создаю события календаря из своего приложения:

for(CalendarEventDescriptor calendarEventDescriptor : calendarEventDescriptors.values()) {
                if(calendarEventDescriptor.startMilliseconds>now){

                    values = new ContentValues();
                    values.put(CalendarContract.Events.DTSTART, calendarEventDescriptor.startMilliseconds);
                    values.put(CalendarContract.Events.DTEND, calendarEventDescriptor.endMilliseconds);
                    values.put(CalendarContract.Events.TITLE, calendarEventDescriptor.title);
                    values.put(CalendarContract.Events.DESCRIPTION, calendarEventDescriptor.description);

                    values.put(CalendarContract.Events.CALENDAR_ID, 1);
                    values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);
                    uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
                    calendarEventDescriptor.eventId = Long.parseLong(uri.getLastPathSegment());
                }
            }

Во время написания я храню массив всех созданных мной идентификаторов событий, так что, когда пользователь щелкает переключатель, я просматриваю их и удаляю из календаря.

for(long eventId : eventIds) {
                if(eventId>0){
                    Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId);
                    rowsDeleted += application.getContentResolver().delete(deleteUri, null, null);
                }
            }

Мне пришло в голову, что можно было бы указать собственное значение для одного из столбцов CalendarContract.Events., чтобы я мог удалить все события сразу, и что мне не нужно запоминать их идентификаторы (Я всегда удаляю их все, никогда не удаляю определенные)

Возможно ли это, и какой столбец CalendarContract.Events. мне следует использовать, и как мне тогда удалить?

2
J. K. 25 Дек 2015 в 16:34

3 ответа

Лучший ответ

Хороший вопрос! Я согласен, что дополнительное свойство в ContentValues - это то, что нужно в этом случае. Я сделал это, повторно используя CalendarContract.Events.CUSTOM_APP_PACKAGE, как нечто невидимое для пользователя, и пока никаких побочных эффектов не обнаружено:

Итак, я создаю События, как и вы:

        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.CALENDAR_ID, 1);
        values.put(CalendarContract.Events.DTSTART, ...);
        values.put(CalendarContract.Events.DTEND, ...);
        values.put(CalendarContract.Events.TITLE, ...);
        values.put(CalendarContract.Events.DESCRIPTION, ....);
        values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getApplicationContext().getPackageName());
        values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
        cr.insert(CalendarContract.Events.CONTENT_URI, values);

А когда мне нужно удалить их все, я звоню:

    Cursor cursor = cr
            .query(CalendarContract.Events.CONTENT_URI,
                   new String[] { CalendarContract.Events._ID, CalendarContract.Events.CUSTOM_APP_PACKAGE },
                   null, null, null);
    cursor.moveToFirst();

    String idsToDelete = "";
    for (int i = 0; i < cursor.getCount(); i++) {
        // it might be also smart to check CALENDAR_ID here
        if (getApplicationContext().getPackageName().equals(cursor.getString(1))) {
            idsToDelete += String.format("_ID = %s OR ", cursor.getString(0));
        }

        cursor.moveToNext();
    }

    if (idsToDelete.endsWith(" OR ")) {
        idsToDelete = idsToDelete.substring(0, idsToDelete.length()-4);
    }

    cr.delete(CalendarContract.Events.CONTENT_URI, idsToDelete, null);

Я надеюсь, что это помогает

3
Konstantin Loginov 28 Дек 2015 в 14:48

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

val operationList = ArrayList<ContentProviderOperation>()
var contentProviderOperation: ContentProviderOperation

appointments.forEach {
   contentProviderOperation = ContentProviderOperation
  .newDelete(CalendarContract.Events.CONTENT_URI)
  .withSelection(CalendarContract.Events.ORIGINAL_SYNC_ID + " =?", arrayOf(it.id))
  .build()

  operationList.add(contentProviderOperation)
}

contentResolver.applyBatch(CalendarContract.AUTHORITY, operationList)
0
ravid rinek 12 Дек 2018 в 14:53

Вы можете использовать ContentProviderOperation с applyBatch для выполнения нескольких удалений / вставляет в одну транзакцию.

Проверьте этот SO-ответ для примера кода.

1
Community 23 Май 2017 в 10:28