2013-02-20 10 views
25

Sto provando a fare in modo che l'app aggiunga promemoria al calendario dell'utente. Il codice cerca title e start date per verificare se l'evento esiste già nel calendario prima di aggiungerlo (in modo da non avere duplicati). Il mio problema è questo: se rimuovo manualmente l'evento dal calendario (usando il calendario), l'evento scompare dal calendario (sto visualizzando tutti i miei calendari e non riesco a vederlo nell'applicazione calendario) ma non dal database. Un'altra cosa che non capisco è che ho provato a rimuovere gli eventi a livello di codice, ma ancora non vengono rimossi.Eliminazione di eventi dal calendario non cancellato

Ecco il mio frammento di codice:

Cursor cur = null; 
ContentResolver cr = getContentResolver(); 
String calUriString = "content://com.android.calendar/events"; 
Uri cal=Uri.parse(calUriString); 
String[] EVENT_PROJECTION=new String[]{"calendar_id","title","dtstart","_id"}; 
String selection = "((" + "calendar_id" + " = 1) AND (" 
     + "title" + " LIKE '"+name+"') AND (" 
     + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+"))"; 

cur = cr.query(cal, EVENT_PROJECTION, selection, null, null); 

boolean found=false; 
if(cur!=null) 
    if(cur.moveToFirst()){ 
     DatabaseUtils.dumpCursor(cur);/*Just to view my results (which always include the deleted events)*/ 
     do{ 
      if(cur.getString(1).equals(name)){ 
       /*I use this part to try to remove the events manually*/ 
       Uri eventUri =ContentUris.withAppendedId(cal, Long.valueOf(cur.getString(3))); 
       String reminderUriString = "content://com.android.calendar/reminders"; 
       Uri remUri =Uri.parse(reminderUriString); 
       cr.delete(remUri, "event_id="+cur.getString(3), null); 
       cr.delete(eventUri, null, null); 
       /*It is not working also*/ 

       Toast.makeText(getApplicationContext(), "Event already exists in Calendar", Toast.LENGTH_LONG).show(); 
       found=true; 
       //break; 
      } 
     }while(cur.moveToNext()); 
    } 
    cur.close(); 
    if(found){ 
     /*Event is found even if I remove it from the Calendar manually and even if I remove it programmatically using cr.delete()*/ 
    } 
    else{ 
     values.put("calendar_id",1); /*I am using the same Calendar that I query, or is this wrong*/ 
     values.put("title", name); 
     /*More values are added*/ 
     Uri calendarUri = cr.insert(cal, values); 
     long eventID = Long.parseLong(calendarUri.getLastPathSegment()); 
     String reminderUriString = "content://com.android.calendar/reminders"; 
     ContentValues reminderValues = new ContentValues(); 
     reminderValues.put("event_id", eventID); 
     reminderValues.put("minutes", 5); 
     reminderValues.put("method", 1); 
     Uri reminderUri = getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues); 
    } 

Perché sono gli eventi ancora presenti dopo averli rimossi dalla applicazione di calendario e perché non sono io in grado di rimuoverlo, anche a livello di codice?

Aggiornamento Il problema è solo se uso calendar_id=1 per l'inserimento e la cancellazione. Altri calendar_id funzionano bene.

Aggiornamento 2 Ho testato il codice su Samsung Galaxy S1 e funziona correttamente. Sembra essere un problema in Samsung Galaxy S3 (dove ho il mio problema, penso che sia un bug nell'app S-planner)

+0

se si riavvia l'app, gli eventi eliminati appaiono ancora al suo interno? – NathanTempelman

+0

Sì, anche se si riavvia il telefono, non vengono visualizzati nell'app Calendario, ma vengono comunque visualizzati in ContentResolver.query() –

+0

@Mohamed_AbdAllah Non posso dire con certezza se questo è il caso, ma problemi simili possono essere visti con query su generi e musica. Devi capire se è un bug =/ – Warpzit

risposta

17

Se il suo non è un problema URI,

Puoi provare a includere nella stringa di selezione

AND (deleted != 1) 

quindi la stringa di selezione diventa,

String selection = "((" + "calendar_id" + " = 1) AND (" 
    + "title" + " LIKE '"+name+"') AND (" 
    + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+") AND (deleted != 1))"; 

Di tanto in tanto, il CalendarDB prende qualche tempo per gli eventi da rimuovere. Ma la COLONNA "cancellata" sarà contrassegnata come "1" che indica che saranno presto eliminati. Il motivo del ritardo potrebbe essere che il calendario sia in attesa di essere sincronizzato

p.s: provare a utilizzare questo strumento - http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx per visualizzare il DB del calendario. Fare riferimento ai e colonne 'cancellati' 'sporchi' nel db

+1

C'è ancora un bug nell'app S-planner su Galaxy S3 poiché gli eventi cancellati non vengono mai cancellati con il tempo come hai detto. Il tuo codice funziona nel filtrare gli eventi eliminati dal risultato della query, ma ho acceso e spento il mio telefono e ho atteso un sacco di tempo e gli eventi sono ancora nel DB ContentProvider (sebbene con la colonna cancellata = 1) e mai rimossi. –

+0

Esiste una sincronizzazione per il calendario in cui l'evento viene eliminato (come l'account di Exchange o l'account Google). Se è così allora, ci vorrà un po 'di tempo per essere sincronizzato e cancellato. –

+1

Ho affrontato questo problema da due mesi e i dati che ho aggiunto due mesi fa sono ancora presenti (con stato eliminato). Non penso che sia un problema di tempo. –

1

Diverse versioni di Android utilizzano diversi percorsi URI per cercare i dati del calendario. Ad esempio, è possibile utilizzare i seguenti costanti per Android 2.1 e 2.2:

private static final String URI_VERSION_2_1 = "content://calendar/events"; 
private static final String URI_VERSION_2_2 = "content://com.android.calendar/events"; 

In 4.0 un metodo diverso è preferito:

http://android-developers.blogspot.com/2011/10/ics-and-non-public-apis.html http://developer.android.com/reference/android/provider/CalendarContract.Events.html

C'è una buona probabilità che il Galaxy S3 ha almeno Android 4.0 su di esso. Questo cambiamento può spiegare il codice che funziona su un S1, ma non un S3.

+1

Questo non è un problema URI. Ho già trovato i dati usando l'URI a/m ed è ancora visibile nel Cursore se cancellato da S-Planner. Ho provato a cambiare l'URI, ma ottengo lo stesso risultato. –

+0

Ok. Immagino che uno dei miei punti sia che se non sei> = 4.0 e non stai usando le nuove API, che Google dice buona fortuna, il tuo codice probabilmente si romperà a un certo punto. So che non ti aiuta troppo, ma questa è la loro dichiarazione ufficiale. – Shellum

+1

Grazie per il vostro supporto, ma in realtà ho provato quasi tutto, compresa la specifica dell'URI per SDK. –

0

Si può anche fare qualcosa di simile:

private boolean isEventInCal(Context context, String id) { 
    Uri event = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, Long.parseLong(id)); 

    Cursor cursor = context.getContentResolver().query(event, null, null, null, null); 
    if (cursor != null && cursor.getCount() == 1) { 
     //the event exists? 
     if (cursor.moveToFirst() && !TextUtils.equals(cursor.getString(cursor.getColumnIndex("deleted")), "1")) { 

      cursor.close(); 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

funziona su tutti i dispositivi.

Problemi correlati