Pergunta sobre calendar, android – Excluir apenas uma instância de um evento recorrente do meu calendário Android

5

Eu tenho procurado em vários posts sobre como excluir apenas uma instância de um evento recorrente da agenda do meu Android 2.3 Phone, mas não consegui encontrar a resposta perfeita. Até agora, o melhor que encontrei é:

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

Onde id2 é o id do evento que eu quero excluir. O problema que tenho é que eu só quero excluir uma instância de um evento recorrente, mas esse código exclui todas as ocorrências. Existe uma maneira de excluir apenas uma instância? Obrigado.

Você já encontrou solução para isso? nikmin

Sua resposta

3   a resposta
6

Se alguém ainda está lutando com isso, eu finalmente decifrei!

Acontece que você não exclui ou corrige nenhum registro, o que você realmente faz é inserir um novo evento chamado exceção. Levei alguns meses para encontrar essa informação em qualquer lugar, e mesmo tendo descoberto, outros meses para descobrir exatamente o que precisava ser colocado na exceção para que funcionasse, então aqui está como eu fiz isso.

Em primeiro lugar, consulte a instância real do evento para o qual você deseja cancelar uma ocorrência. Você precisa consultar a tabela CalendarContract.Instances para obter os valores de CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN e CalendarContract.Instances.EVENT_ID. A maneira como faço isso no meu código não se encaixa no contexto dessa resposta, então espero que você consiga descobrir como fazer isso sozinho. Armazene estes valores como:

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

Então precisamos configurar um novo evento da seguinte maneira:

<code> 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();
}
</code>

Espero que isso funcione, eu tentei cortar as partes do meu código que não são relevantes. Você notará que estou tendo que adicionar 3600000 ao valor inicial (1 hora em milissegundos). Eu suponho que é porque estamos no BST no momento e este código não irá funcionar uma vez que os relógios mudam, mas eu vou me preocupar com isso no momento!

Finalmente, usei um aplicativo chamado Content Provider Helper para ajudar a descobrir isso. Você pode usá-lo para consultar suas tabelas de provedores de conteúdo. Eu tentaria configurar uma exceção usando meu código, em seguida, usar meu aplicativo de calendário de telefones para excluir a instância e comparar os dois registros.

1

EXDATEcoluna do evento original.

6
Aqui estão as noções básicasEncontre a instância que você deseja excluir. (usandoInstances.query())Crie oexceção URI com o ID do eventoacrescentado.CrioContentValues. Coloque sua instânciaINÍCIO valor como... Eventos.ORIGINAL_INSTANCE_TIME. ColocarSTATUS_CANCELED Como... Eventos.STATUSAgora apenasinsert (yourURI, yourValues) e é isso!

Perguntas relacionadas