查找对android的原生日历的更改

时间:2014-07-28 10:56:02

标签: android calendar listener

我正在编写一个应用程序,自上次执行这样的“同步”操作以来,需要获取android的本机日历的最新更改。

我也在访问其他内容,例如联系人。在这里,我可以可靠地检查RawContact的VERSION列是否随时间发生变化,但是我找不到日历事件的类似选项。

注册ContentObserver仅在某些内容发生更改时触发,但不会产生更改的行。我考虑过查询任何将DIRTY列设置为1的行的Calendar.Events ContentProvider,但是我会受到Google同步适配器的支配,这可能比我的查询处理更快(?)。

同样,当Android设备上没有网络连接时,脏列将保持为1,这会对我的用例产生不合适的结果。

是否有更好的方法来监听对原始Android日历的更改,即使没有网络连接,也会返回正确的结果?

1 个答案:

答案 0 :(得分:0)

显然,没有简单的方法可以做到这一点。

以下是我解决此问题的方法: 我为上次查询数据库时发现的联系人保留了本地缓存数据库。每当发生更改时(通过调用ContentObserver :: onChange()通知),我使用CursorJoiner将缓存数据库中的条目与CalendarContract.Contacts中的条目进行比较。

两个游标中存在的ID需要进行比较以进行更改。为此,我为每个内容生成了一个哈希值,我将其存储在缓存数据库中的联系人ID旁边。

仅ContentProvider提供的ID表示自上次“同步”以来的新联系人,而仅包含在缓存DB中的ID是已删除的联系人。

一旦获得差异,就需要相应地更新缓存数据库。