2012-04-13 26 views
9

Estoy tratando de usar la nueva API de calendario de Android para leer todos los eventos del calendario de hoy. Tengo problemas para encontrar la selección correcta en la consulta de la base de datos para devolver todos los eventos. Parece que todos los eventos recurrentes y de todo el día quedan fuera de la selección. ¿Qué argumentos de selección me permitirían obtener todos los eventos de hoy en la API del calendario?Lectura de todos los eventos de hoy con CalendarContract - Android 4.0+

Aquí está mi intento actual:

Cursor cur = null; 
    String selection = "((" + CalendarContract.Events.DTSTART 
      + " >= ?) AND (" + CalendarContract.Events.DTEND + " <= ?))"; 
    Time t = new Time(); 
    t.setToNow(); 
    String dtStart = Long.toString(t.toMillis(false)); 
    t.set(59, 59, 23, t.monthDay, t.month, t.year); 
    String dtEnd = Long.toString(t.toMillis(false)); 
    String[] selectionArgs = new String[] { dtStart, dtEnd }; 
    cur = c.getContentResolver().query(CalendarContract.Events.CONTENT_URI, 
      null, selection, selectionArgs, null); 

estoy seguro de cómo ampliar la selección o añadiendo a la misma para obtener los acontecimientos que se repiten y todos los eventos del día. Cualquier ayuda sería apreciada.

+1

¿Ya se dio cuenta? Estoy atascado con el mismo problema – MobileMon

+0

He encontrado la solución. Voy a publicarlo momentáneamente –

+0

@MobileMon He publicado la respuesta. ¡Aclamaciones! : D –

Respuesta

18

para obtener todos los eventos de hoy, incluyendo eventos recurrentes, es necesario utilizar la tabla de instancias, es decir

Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI 
      .buildUpon(); 
ContentUris.appendId(eventsUriBuilder, timeNow); 
ContentUris.appendId(eventsUriBuilder, endOfToday); 
Uri eventsUri = eventsUriBuilder.build(); 
Cursor cursor = null;  
cursor = mContext.getContentResolver().query(eventsUri, columns, null, null, CalendarContract.Instances.DTSTART + " ASC"); 

Tenga en cuenta que debe agregar las restricciones de tiempo a los eventos uri, no puede ordenar de ninguna otra manera.

Para incluir también todos los eventos del día, simplemente expanda la búsqueda a las 11:59 PM de la noche anterior y a las 12:00 AM de esta noche.

+0

¿Qué puedo poner en "columnas"? – TamarG

2

debería poder agregar CalendarContract.Events.ALL_DAY a su condición de selección para filtrar todos los eventos ALL_DAY.

+0

Todavía tengo que encontrar eventos recurrentes, ya que no son mostrar ser parte de la fecha del día actual. ¿Cómo se almacenan los eventos recurrentes? –

+1

@BananaNutTruffles los eventos recurrentes también se reflejan en la tabla de instancias. Eso está en contraste con la tabla de Eventos que solo contiene el evento inicial que define la secuencia de "instancias". – Moritz

5

Sus condiciones solo le ofrecen los eventos que están estrictamente dentro de los límites de hoy. Debe verificar los que comienzan antes de hoy y terminan después (evento de varios días).

Para los eventos recurrentes, los reviso manualmente. No encuentro otra forma.

que usar algo como:

String selection = "((" + CalendarContract.Events.DTSTART + " <= ?) AND (" + CalendarContract.Events.DTEND + " >= ?)) OR (" + CalendarContract.Events.RRULE + " is not null)"; 

String[] selectionArgs = new String[] { dtEnd, dtStart}; 

Saludos,

+4

Para incluir eventos recurrentes, se debe consultar el [CalendarContracts.Instance] (http://developer.android.com/reference/android/provider/CalendarContract.Clase de Instances.html). –

2

Sé que esto es un poco tarde, pero tenía una pregunta muy similar y tuve problemas para encontrar la respuesta que estaba buscando. La zona horaria UTC forzada para eventos de todo el día hizo las cosas complicadas. Aquí está mi solución:

// "allDayStart" is an all-day event today, encoded in the default time zone 
    Time allDayStart = new Time(); 
    allDayStart.timezone=TimeZone.getDefault().toString(); 
    allDayStart.set(dayStart.monthDay, dayStart.month, dayStart.year); 

    // 2 time selections for the query: 
     // 1) Between day-start and day-end (not all-day); or 
     // 2) Equals today at 0:00:00 (all-day) in the default timezone 
    String calSelection = 
     "((" + Calendars.ACCOUNT_NAME + " = ?) " + 
      "AND (" + Calendars.OWNER_ACCOUNT + "= ?) " + 
      "AND (" + 
       "((" + Events.DTSTART + ">= ?) " + 
       "AND (" + Events.DTSTART + "<= ?) " + 
       "AND (" + Events.ALL_DAY + "= ?) " + 
       ") " + 
      "OR ((" + Events.DTSTART + "= ?) " + 
       "AND (" + Events.ALL_DAY + "= ?)" + 
       ")" + 
      ")" + 
     ")"; 

    String[] calSelectionArgs = new String[] { 
     accountName, ownerName, 
     dayStartInMillis.toString(), dayEndInMillis.toString(), "0", // during today, not all day 
     allDayStartInMillis.toString(), "1" // Started today at default start-time for all-day events (all-day), default time zone 
    }; 

La consulta podría ser refinado para no necesitar 2 partes, pero esto era lo suficientemente bueno para mí.

En caso de que ayuda, aquí es donde dayStart y DAYEND vinieron de:

Time dayStart = new Time(); 
    dayStart.setToNow(); 
    dayStart.hour=0; 
    dayStart.minute=0; 
    dayStart.second=0; 

    Time dayEnd = new Time(); 
    dayEnd.set(dayStart); 
    dayEnd.hour=dayStart.hour+23; 
    dayEnd.minute=dayStart.minute+59; 
    dayEnd.second=dayStart.second+59; 

    Long dayStartInMillis = dayStart.toMillis(false); 
    Long dayEndInMillis = dayEnd.toMillis(false) + 999; 
    Long allDayStartInMillis = allDayStart.toMillis(false); 
Cuestiones relacionadas