【问题标题】:delete events from Calendar Provider on Android从 Android 上的日历提供程序中删除事件
【发布时间】:2014-04-25 20:46:00
【问题描述】:

我有一个应用程序,它使用日历提供程序来添加、编辑和删除事件。我有一个日历界面,它显示了哪些日子附加了事件。添加事件完美。为了添加一个事件,我用数字 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?

【问题讨论】:

标签: java android events android-calendar


【解决方案1】:

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

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

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

【讨论】:

  • 仍然没有解释为什么不同步就自动删除警报,为什么不同步就自动设置更新,以及为什么不同步就自动设置添加。但我明白你的解释,谢谢
  • 对于我必须检查的警报,也许它们根本没有同步......至于更新,不需要等待同步,因为更新的行的值足以向服务器发送数据。插入也是一样。删除的情况不同,因为 SyncAdapter 对脏行进行查询以了解要发送到服务器的内容,因此如果该行已被删除,则无法发送任何内容...
  • 闹钟也会同步,我认为(不确定),因为您可能会收到有关某个事件的电子邮件通知或短信通知,并且这些闹钟可以在您的 Google 帐户中看到。这就是为什么我对这一期的删除感到非常惊讶的原因。另外,我考虑过这种情况,检查了 Deleted 的标志,以便我可以根据需要过滤事件。因为我根本不需要同步,所以我决定创建一个本地日历。但是你有最好的答案,我会把它作为正确的答案发布。非常感谢
  • 确实同步了警报。看日历提供者的代码,我也有关于闹钟的解释。当警报被删除时,相应的事件仍在数据库中,并被标记为“脏”。当下一次同步运行时,整个脏事件连同它的警报一起被推送到服务器,所以如果没有警报发送,服务器知道它必须删除它。
【解决方案2】:

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

这又证明了在 Android 上编程是多么烦人,尤其是在没有特别注意这些小细节的情况下。我花了 2 天时间才发现这个基本问题...

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多