Android Calendar Provider Sync - SYNC_DATA 列?

Chr*_*ser 5 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 来存储上次修改的日期,我只需将其用于同步逻辑就可以了,我只需要确定这是一个约定。

dst*_*dst 2

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

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


但是,我强烈感觉您没有正确同步。要同步日历,您必须使用单独的日历,而不是由 Google 或任何其他第三方应用程序同步的任何日历。我还将列出我认为您执行过的其他一些步骤,但可能对其他人有帮助。

您还需要将一些参数附加到您对系统的任何请求中,以便您可以访问同步适配器字段。AbstractThreadedSyncAdapter此外,您应该仅从实现同步您的日历。为此,您还需要提供一个身份验证器(如果您还没有)(以便用户能够在帐户的同步首选项中启用/禁用您的同步适配器)。有关同步适配器的概述可以在这篇博客文章中找到。

如果您没有服务器端帐户并且只有一个日历,则第一次启动时需要执行一些操作:

  1. 创建一个帐户
  2. 创建与该帐户绑定的日历
  3. 启用您的同步适配器

之后,Android 将不时执行您的同步适配器,您可以访问列SYNC_DATA而不会发生冲突(在您创建的日历中),并且DIRTY标志可以正确提供。