Android日历提供程序同步 - SYNC_DATA列?

时间:2012-11-12 13:48:50

标签: android calendar sync android-contentprovider

我想在内部Android日历和我的应用程序之间进行同步。 我正在使用从Android API 14开始提供的CalendarContract。

内容提供程序“com.android.calendar”的任何更改都会调用同步适配器的onPerformSync(..)。 但是,此时,事件的所有行都设置为DIRTY = 0。 这意味着,在我的同步适配器可以访问之前,Google日历同步必须将DIRTY FLAG设置为零。

CalendarContract.EventsColumns.SYNC_DATA1 - SYNCDATA10被称为内容提供程序的列,用于同步适配器。 有谁知道这些列的使用是否有一些约定? 我意识到在我的设备上SYNC_DATA5存储了上次修改的日期,而SYNC_DATA1似乎存储了Google事件ID。因此,只要日历应用与Google日历同步,这些列就会被修改。

但是,如果我选择将其中一列用于我的同步适配器,我如何确保其他应用程序不使用相同的列并且它们相互覆盖?

如果Google日历始终使用SYNC_DATA5来存储上次修改的日期,那么只需将其用于我的同步逻辑就可以了,我只需要确定这是一种惯例。

1 个答案:

答案 0 :(得分:1)

SYNC_DATA列可用于任何值。我不确定谷歌日历是如何做到的,但它们是用于与同步适配器相关的内容,不同步日历的应用程序不得使用它们。因此,您可以安全地使用任何列(假设您不在应用程序版本之间进行更改,或者您必须编写迁移代码),因为您的日历上不应该有任何其他同步适配器。

当不是同步适配器时,您不能依赖SYNC_DATA列,当日历不是“你的”时,请不要使用它们。


然而,我强烈感觉你没有正确同步。要同步日历,您必须使用单独的日历,而不是谷歌或任何其他第三方应用同步的任何日历。我还列出了我认为你所做的其他一些步骤,但可能对其他人有帮助。

系统还需要append some parameters to any of your requests,以便您可以访问同步适配器字段。此外,您应该仅从AbstractThreadedSyncAdapter implementation同步日历。为此,您还需要提供验证器(如果还没有验证器)(这样用户就可以在帐户的同步首选项中启用/禁用同步适配器)。可以找到有关同步适配器的概述in this blog post

如果您没有服务器端帐户且只有一个日历,则首次启动时需要做一些事情:

  1. 创建帐户
  2. 创建绑定到该帐户的日历
  3. 启用同步适配器
  4. 之后,Android会不时地执行您的同步适配器,您可以访问SYNC_DATA列而不会发生冲突(在您创建的日历中)并且DIRTY标志正确提供