contact_last_updated_timestamp 标志 returns 究竟是什么?

What exactly contact_last_updated_timestamp flag returns?

我正在获取在给定时间戳后更新的联系人,我的代码是

Uri uri = ContactsContract.Contacts.CONTENT_URI;
Cursor cursor = cur = contentResolver.query(uri, null, "contact_last_updated_timestamp > ?", new String[]{timeStamp}, null);

但是光标 returns 在给定 timestamp.
之后不是 updated/deleted/added 的联系人 问题是光标是 returns 设备联系人列表中的一些联系人。
这意味着查询错误的可能性较小。
我的问题是,为什么光标返回不是 updated/deleted/added 的联系人?
如何获取在给定时间戳后更新的联系人列表? (不使用 ContentObserver)

提前致谢!

几乎所有设备上的联系人都来自某些云源,例如 Google 联系人。

在这种情况下,有一个 SyncAdapter 运行 会定期检查所有联系人,以确保他们与他们的云版本同步(同步和同步任何更改).

大多数SyncAdapter也会修改联系人数据中的一些值(通常是RawContact的SYNC1,SYNC2,SYNC3字段)来存储一些关于同步过程的信息, 例如此联系人最后一次同步是在该时间戳。

这使得 CONTACT_LAST_UPDATED_TIMESTAMP 字段对您要执行的操作毫无用处。

如果我 运行 在我的设备上查询,以检查在过去 24 小时内更新了哪些联系人,我得到 1036 个联系人中的 1003 个已被修改。

编辑:

If i write ContentObserver to listen for changed caontacts, will it be called for above scenario

它每天会被调用很多次,比你想象的要多...

我发现的唯一可行的选择是在给定点保留联系人数据库状态的缓存副本,并将其与更新后的状态进行比较。

您不需要保留所有联系人的所有数据,只需保留一些表示联系人状态的哈希值(long 或 int),因此您需要保留一个映射并将其持久化到本地数据库或文件,一段时间后,您可以再次创建该地图并将其与之前的地图进行比较,以找出已删除、添加或修改的联系人。 确保在计算哈希值时只考虑姓名、电子邮件、电话等有趣的字段,这样那些 SYNC1、SYNC2 频繁更改就不会触发误报