5

我想在内部 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 日历同步时,这些列似乎都会被修改。

但是,如果我选择为我的同步适配器使用这些列之一,我如何确保另一个应用程序不使用相同的列并且它们相互覆盖?

如果谷歌日历总是使用 SYNC_DATA5 来存储上次修改的日期,我可以将它用于我的同步逻辑,我只需要确定这是一个约定。

4

1 回答 1

2

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

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


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

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

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

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

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

于 2013-09-19T22:21:08.120 回答