2013-02-20 8 views
25

Ich versuche, meiner App Erinnerungen an den Kalender des Benutzers hinzuzufügen. Der Code sucht nach title und start date, um zu überprüfen, ob das Ereignis bereits im Kalender vorhanden ist, bevor es hinzugefügt wird (um keine Duplikate zu erhalten). Mein Problem ist folgendes: Wenn ich das Ereignis manuell aus dem Kalender entferne (mit dem Kalender), verschwindet das Ereignis aus dem Kalender (ich sehe alle meine Kalender und kann es nicht in der Kalenderanwendung sehen), aber nicht aus der Datenbank. Eine andere Sache, die ich nicht verstehe, ist, dass ich versucht habe, die Ereignisse programmgesteuert zu entfernen, aber sie werden trotzdem nicht entfernt.Löschen von Ereignissen aus dem Kalender, die nicht gelöscht werden

Hier ist mein Code-Schnipsel:

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

Warum sind die Ereignisse noch vorhanden, nachdem sie aus der Kalender-Anwendung zu entfernen und warum bin ich es zu entfernen, auch programmatisch nicht in der Lage?

aktualisieren Das Problem ist nur, wenn ich calendar_id=1 zum Einfügen und Löschen verwenden. Andere calendar_id s funktionieren gut.

Update 2 Ich habe den Code auf Samsung Galaxy S1 getestet und es funktioniert gut. Es scheint ein Problem in Samsung Galaxy S3 zu sein (wo ich mein Problem habe, ich denke, es ist ein Fehler in der S-Planer App)

+0

Wenn Sie Ihre App neu starten, werden die gelöschten Ereignisse weiterhin angezeigt? – NathanTempelman

+0

Ja, auch wenn ich das Telefon neu starte, erscheinen sie nicht in der Kalender-App, erscheinen aber immer noch im ContentResolver.query() –

+0

@Mohamed_AbdAllah Ich kann nicht sicher sagen, ob das der Fall ist, aber ähnliche Probleme können bei der Abfrage von Genres und Musik gesehen werden. Sie müssen herausfinden, ob es ein Bug ist =/ – Warpzit

Antwort

17

Wenn ihr nicht ein URI Problem,

Können Sie versuchen, in der Auswahlleiste

AND (deleted != 1) 

so die Auswahlleiste wird,

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

Gelegentlich enthalten, die CalendarDB irgendwann nimmt um die Ereignisse zu entfernen. Die 'gelöschte' Spalte wird jedoch als '1' markiert, um anzuzeigen, dass sie bald gelöscht wird. Der Grund für die Verzögerung möglicherweise der Kalender wartet auf die Synchronisierung

S. s: Verwenden Sie dieses Tool - http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx, um die Kalender-DB zu visualisieren. Bitte überprüfen Sie die ‚gelöscht‘ und ‚schmutzig‘ Spalten in der db

+1

Es gibt immer noch einen Fehler in der S-Planer-App auf Galaxy S3, da die gelöschten Ereignisse nie mit der Zeit gelöscht werden, wie Sie erwähnt haben. Ihr Code filtert die gelöschten Ereignisse aus dem Abfrageergebnis, aber ich habe mein Telefon ein- und ausgeschaltet und viel Zeit gewartet und die Ereignisse befinden sich immer noch in der ContentProvider-Datenbank (obwohl die Spalte gelöscht = 1 ist) und nie entfernt wurde. –

+0

Gibt es eine Synchronisierung für den Kalender, in dem das Ereignis gelöscht wird (wie ein Exchange-Konto oder ein Google-Konto)? Wenn dies der Fall ist, wird es einige Zeit dauern, um synchronisiert und gelöscht zu werden. –

+1

Ich bin seit zwei Monaten mit diesem Problem konfrontiert und die Daten, die ich vor zwei Monaten hinzugefügt habe, sind immer noch vorhanden (mit gelöschtem Status). Ich denke nicht, dass es ein Zeitproblem ist. –

1

Verschiedene Versionen von Android verwenden verschiedene URI-Pfade zum Nachschlagen von Kalenderdaten. Zum Beispiel könnten Sie die folgenden Konstanten für Android 2.1 verwenden und 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 eine andere Methode bevorzugt wird:

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

Es gibt eine gute Chance, dass das Galaxy S3 hat mindestens Android 4.0 drauf. Diese Änderung kann für den Code verantwortlich sein, der an einem S1, aber nicht an einem S3 arbeitet.

+1

Dies ist kein URI-Problem. Ich finde die Daten bereits mit dem a/m-URI und ist immer noch im Cursor sichtbar, wenn er aus S-Planner gelöscht wird. Ich habe versucht, die URI zu ändern, aber ich bekomme die gleiche Ausgabe. –

+0

Okay. Ich denke, einer meiner Punkte ist, dass, wenn Sie nicht> = 4.0 sind und die neuen APIs nicht verwenden, Google viel Glück sagt, wird Ihr Code wahrscheinlich irgendwann kaputt gehen. Ich weiß, das hilft dir nicht zu viel, aber das ist ihre offizielle Aussage. – Shellum

+1

Vielen Dank für Ihre Unterstützung, aber ich habe tatsächlich fast alles ausprobiert, einschließlich der URI pro SDK. –

0

Sie auch so etwas tun kann:

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

Es funktioniert auf allen Geräten.

Verwandte Themen