I am trying to make my App add reminders to the user's Calendar. The code searches for the title
and start date
to check if the event already exists in the Calendar before adding it (so as not to have duplicates). My problem is that: if I remove the event from the Calendar manually (using the Calendar), the event disappears from the Calendar (I am viewing all my Calendars and can't see it in the Calendar Application) but not from the DataBase. Another thing I don't understand is that I tried to remove the events programmatically, but still they are not removed.
Here is my code snippet:
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);
}
Why are the events still present after removing them from the calendar Application and why am I not able to remove it even programmatically?
Update
The problem is only if I use calendar_id=1
for inserting and deleting. Other calendar_id
s work fine.
Update 2 I tested the code on Samsung Galaxy S1 and it is working fine. It seems to be a problem in Samsung Galaxy S3 (where I have my problem, I think it is a bug in the S-planner App)
Turn off iCloud sharing for all your calendars. This should delete all the calendar data and events from your iPhone. Then, enable iCloud sharing and the problematic event should be gone now. You can use this method to disable event syncing with any third-party calendar tools.
If you didn't have edit access to the calendar the event was created on, you won't see the event in the Trash. There's a separate Trash for each calendar you have. Try looking in the Trash for other calendars. Anyone who has edit access to your calendar can delete events forever or restore them.
Tap Calendars and tap the i next to the calendar that was shared with you. Scroll to the bottom of the screen and tap Delete Calendar.
If its not a URI problem,
Can you try to include in the selection string
AND (deleted != 1)
so the selection string becomes,
String selection = "((" + "calendar_id" + " = 1) AND ("
+ "title" + " LIKE '"+name+"') AND ("
+ "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+") AND ( deleted != 1 ) )";
Occasionally, the CalendarDB takes sometime for the events to be removed. But the 'deleted' COLUMN will be marked as '1' indicating that they will be deleted soon. The reason for the delay maybe the calendar is waiting to be synced
p.s: Try using this tool -- http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx to visualize the Calendar DB. Please check for the 'deleted' and 'dirty' columns in the db
Different versions of android use different URI paths for looking up calendar data. For example, you could use the following constants for android 2.1 and 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 an different method is preferred:
http://android-developers.blogspot.com/2011/10/ics-and-non-public-apis.html http://developer.android.com/reference/android/provider/CalendarContract.Events.html
There is a good chance that the Galaxy S3 has at least Android 4.0 on it. This change may account for the code working on an S1, but not an S3.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With