3

我有一个应用程序,它使用日历提供程序来添加、编辑和删除事件。我有一个日历界面,它显示了哪些日子附加了事件。添加事件完美。为了添加一个事件,我用数字 3 硬编码了 calendarID,所以 calID = 3。

long calID=3;
values.put(Events.DESCRIPTION, description);
    values.put(Events.CALENDAR_ID, calID);
    values.put(Events.EVENT_TIMEZONE, "Europe/London");
    Uri uri = cr.insert(Events.CONTENT_URI, values);

这完美地工作。我编程的视图显示了事件。我打开手机 (Xperia J) 中包含的日历应用程序,我可以看到该事件在那里。

我尝试使用以下代码删除事件:

        ContentResolver cr = mContext.getContentResolver();
    ContentValues values = new ContentValues();
    Uri deleteUri = null;
    deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
    int rows = mContext.getContentResolver().delete(deleteUri, null, null);

此代码直接从 developer.android.com 网站复制而来。这不删除!我调试了代码,'rows' 的值等于 1,所以实际上该行应该已被删除。但是我回到我的应用程序,事件仍然存在。有趣的事情:我检查了手机中的日历应用程序,但那里不存在该事件。所以它已被删除(?)。我想也许我没有刷新我的应用程序,所以我关闭了它,重新安装了它,它永远不会删除。我再次调试要删除的代码,并且“行”值再次等于一,对于同一个事件!所以,'rows' 每次我想删除它时总是返回 1。所以该行被删除了,但它没有被删除。

这里发生了什么?是因为当我添加事件时,我硬编码了 calendarID?

4

3 回答 3

4

正如您所注意到的,在事件同步到服务器之前,删除事件并不会真正从数据库中删除该行。这很合乎逻辑,否则日历同步适配器将无法检索事件数据以向服务器发送 DELETE 请求。这就是为什么在事件表中有一个 DELETED 列,在查询事件时必须检查它:

http://developer.android.com/reference/android/provider/CalendarContract.SyncColumns.html#DELETED

顺便说一句,如果您查询实例而不是事件(它会扩展重复事件),已删除的事件会自动从结果中删除。

于 2013-09-26T09:47:22.913 回答
3

解决了。基本上问题是该事件似乎已在手机上本地删除,但尚未与我的 Google 帐户同步。同步后,这些事件都从我的手机和与手机关联的 Google 帐户中删除。

这是另一个证明在 Android 上编程有多烦人,特别是当没有特别注意这些小细节时。我花了两天时间才发现这个基本问题......

于 2013-09-16T18:51:20.543 回答
1

有两个版本的删除:作为应用程序和作为同步适配器。应用程序删除将删除的列设置为 1。此标志告诉同步适配器该行已被删除,并且此删除应传播到服务器。同步适配器删除会从数据库中删除事件及其所有关联数据。

于 2014-04-25T12:46:00.680 回答