2012-04-13 15 views
9

Sto cercando di utilizzare la nuova API di calendario di Android per leggere tutti gli eventi del calendario di oggi. Ho difficoltà a trovare la giusta selezione nella query del database per restituire tutti gli eventi. Sembra che tutti gli eventi ricorrenti e tutti i giorni siano esclusi dalla selezione. Quali argomenti di selezione mi permetterebbero di ottenere tutti gli eventi di oggi dalle API del calendario?Leggere tutti gli eventi di oggi utilizzando CalendarContract - Android 4.0+

Ecco il mio tentativo in corso:

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

non sono sicuro di come ampliare la selezione o aggiungendo ad esso per ottenere gli eventi ricorrenti e tutti gli eventi al giorno. Qualsiasi aiuto sarebbe apprezzato.

+1

Hai capito questo ancora ??? Sono bloccato con lo stesso problema – MobileMon

+0

Ho trovato la soluzione. Lo posterò momentaneamente –

+0

@MobileMon Ho postato la risposta. Saluti! : D –

risposta

18

per ottenere tutti gli eventi di oggi, tra cui eventi ricorrenti, è necessario utilizzare la tabella di istanze, cioè

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"); 

Si noti che devi aggiungere i limiti di tempo agli eventi uri, non puoi ordinare in nessun altro modo.

Per includere anche tutti gli eventi del giorno, basta espandere la ricerca alle 23:59 della notte precedente e alle 12:00 di stasera.

+0

cosa posso mettere su "colonne"? – TamarG

2

dovresti essere in grado di aggiungere CalendarContract.Events.ALL_DAY alla tua condizione di selezione per filtrare per tutti gli eventi ALL_DAY.

+0

Devo ancora trovare eventi ricorrenti in quanto non sono mostra di essere una parte della data corrente dei giorni. Come vengono memorizzati gli eventi ricorrenti? –

+1

@BananaNutTruffles anche gli eventi ricorrenti vengono specchiati nella tabella Istanze. Ciò è in contrasto con la tabella Eventi che contiene solo l'evento iniziale che definisce la sequenza di "istanze". – Moritz

5

Le tue condizioni ti forniscono solo gli eventi che sono rigorosamente nei limiti di oggi. Dovresti controllare quelli che iniziano prima di oggi e finiscono dopo (evento multidays).

Per gli eventi ricorrenti, li controllo manualmente. Non ho trovato un altro modo.

ho usare qualcosa come:

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

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

saluti,

+4

Per includere eventi ricorrenti, è necessario eseguire una query su [CalendarContracts.Instance] (http://developer.android.com/reference/android/provider/CalendarContract.Classe Instances.html). –

2

So che è un po 'tardi, ma ho avuto una domanda molto simile e ho avuto problemi a trovare la risposta che stavo cercando. Il fuso orario UTC forzato per gli eventi di un'intera giornata ha reso le cose complicate. Ecco la mia soluzione:

// "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 query può essere perfezionata per non aver bisogno di 2 parti, ma questo è stato abbastanza buono per me.

In caso aiuta, ecco dove daystart e dayEnd provenivano da:

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); 
Problemi correlati