Вопрос по android – Удалить только один экземпляр повторяющегося события из моего календаря Android

5

Я просматривал различные сообщения о том, как удалить только один экземпляр повторяющегося события из календаря моего телефона Android 2.3, но мне не удалось найти идеальный ответ. Пока что лучшее, с чем я столкнулся, это:

<code>Uri eventsUri = Uri.parse("content://com.android.calendar/events");
Uri deleteEventUri = Uri.withAppendedPath(eventsUri, String.valueOf(id2));
DeleteEventActivity.context.getContentResolver().delete(deleteEventUri, null, null);
</code>

Где id2 - это идентификатор события, которое я хочу удалить. У меня проблема в том, что я хочу удалить только один экземпляр повторяющегося события, но этот код удаляет все вхождения. Есть ли способ удалить только один экземпляр? Благодарю.

Вы нашли решение этой проблемы? nikmin

Ваш Ответ

3   ответа
6
Here are the basics Find the instance you want to delete. (using Instances.query()) Create the exception URI with the event ID appended. Create ContentValues. Put your instance's BEGIN value as ...Events.ORIGINAL_INSTANCE_TIME. Put STATUS_CANCELED as ...Events.STATUS Now only insert(yourURI, yourValues) and that's it!
6

Оказывается, вы не удаляете и не изменяете какие-либо записи, фактически вы вставляете новое событие, называемое исключением. Мне потребовалось несколько месяцев, чтобы найти эту информацию где угодно, и даже найдя ее, еще несколько месяцев, чтобы понять, что именно нужно включить в исключение, чтобы заставить его работать, поэтому вот как я это сделал.

Во-первых, запросите фактический экземпляр события, для которого вы хотите отменить одно вхождение. Вам нужно запросить таблицу CalendarContract.Instances, чтобы получить значения CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN и CalendarContract.Instances.EVENT_ID. То, как я делаю это в своем коде, не совсем соответствует контексту этого ответа, так что, надеюсь, вы сможете решить, как это сделать самостоятельно. Сохраните эти значения как:

final String title = eventCursor.getString(0); final long beginl=eventCursor.getLong(1); final int id = eventCursor.getInt(2);

Затем нам нужно настроить новое событие следующим образом:

 final Context context = getApplicationContext();
 final ContentResolver contentResolver = context.getContentResolver();
 final Uri.Builder builder = Uri.parse(
"content://com.android.calendar/events").buildUpon();
 final Cursor eventCursor = contentResolver.query(builder.build(),
new String[] 
   {Events.CALENDAR_TIME_ZONE,Events.ALL_DAY,Events.CALENDAR_ID,Events._SYNC_ID,     Events.OWNER_ACCOUNT }, 
   "_id=" + id, null, null);
 while (eventCursor.moveToNext()) {
final String timezone=eventCursor.getString(0);
final String allday=eventCursor.getString(1);
final long calID=eventCursor.getLong(2);
final String mSyncId=eventCursor.getString(3);
final String account=eventCursor.getString(4);
ContentValues values = new ContentValues();
    values.put(Events.TITLE, title);
    values.put(Events.EVENT_TIMEZONE, timezone);
values.put(Events.ORIGINAL_SYNC_ID, mSyncId);//not 100% sure about this,may also need a date?
values.put(Events.HAS_ALARM, "0");
values.put(Events.HAS_ATTENDEE_DATA,"0");
values.put(Events.ALL_DAY, allday);
    values.put(Events.DTSTART, beginl+3600000);
    values.put(Events.ORIGINAL_INSTANCE_TIME, beginl+3600000);
values.put(Events.STATUS, Events.STATUS_CANCELED);
Uri uri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI,
        String.valueOf(id));
uri = asSyncAdapter(uri, account, CTS_TEST_TYPE);
Uri resultUri = context.getContentResolver().insert(uri, values);
    try {
        int eventID = Integer.parseInt(resultUri.getLastPathSegment()); 
        int debug=eventID;
        } catch (Exception e) {
        int debug=0;
        }
}
static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()  
    .appendQueryParameter
        (android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
    .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
    .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}

Надеюсь, это сработает, я пытался вырезать части моего кода, которые не имеют отношения к делу. Вы заметите, что мне нужно добавить 3600000 к начальному значению (1 час в миллисекундах). Я предполагаю, что это потому, что в данный момент мы находимся в BST, и этот код не будет работать после смены часов, но я буду беспокоиться об этом сейчас!

Наконец, я использовал приложение под названием Content Provider Helper, чтобы помочь мне это выяснить. Вы можете использовать его для запроса таблиц вашего контент-провайдера. Я попытался бы создать исключение, используя мой код, затем использовать приложение календаря для телефонов, чтобы удалить экземпляр, и сравнить две записи.

1

EXDATE столбец исходного события.

Похожие вопросы