从日历中删除事件不被删除

我试图让我的应用程序添加提醒到用户的日历。 代码searchtitlestart date以检查事件是否已经存在于日历中,然后添加它(以免重复)。 我的问题是:如果我手动(使用日历)从日历中删除事件,事件从日历中消失(我正在查看所有日历,不能在日历应用程序中看到它),但不是从数据库。 另一件我不明白的事情是,我尝试以编程方式删除事件,但仍然没有删除。

这是我的代码片段:

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

为什么从日历应用程序中删除它们之后,这些事件仍然存在?为什么我无法以编程方式删除它?

更新问题是只有当我使用calendar_id=1插入和删除。 其他calendar_id工作正常。

更新2我testing了三星Galaxy S1上的代码,它工作正常。 这似乎是在三星Galaxy S3的问题(我有我的问题,我认为这是在S规划应用程序中的错误)

如果不是URI问题,

你可以尝试包括在selectstring中

 AND (deleted != 1) 

所以selectstring变成,

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

有时,CalendarDB需要一段时间才能删除事件。 但“已删除”的COLUMN将被标记为“1”,表示它们将很快被删除。 延迟的原因可能是日历正在等待同步

PS:尝试使用此工具 – http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx可视化日历数据库。 请检查数据库中的“已删除”和“脏”列

不同版本的android使用不同的URIpath查找日历数据。 例如,你可以为android 2.1和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"; 

在4.0中,不同的方法是优选的:

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

Galaxy S3至less有Android 4.0的可能性很大。 这个改变可以解释在S1上工作的代码,而不是S3。

你也可以做这样的事情:

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

它适用于所有设备。