【问题标题】:What exactly contact_last_updated_timestamp flag returns?究竟 contact_last_updated_timestamp 标志返回什么?
【发布时间】:2019-08-14 06:30:01
【问题描述】:

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

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

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

提前感谢您!

【问题讨论】:

    标签: android android-contentprovider android-contacts


    【解决方案1】:

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

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

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

    这使得 CONTACT_LAST_UPDATED_TIMESTAMP 字段对于您正在尝试做的事情毫无用处。

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

    编辑:

    如果我编写 ContentObserver 来监听更改的联系人,它会是 要求上述场景

    它每天会被调用很多次,超出你的预期......

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

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

    【讨论】:

    • marmor,谢谢你的回答。如果我编写 ContentObserver 来监听更改的联系方式,是否会在上述情况下调用它(Google 联系人)?
    • @marmor,目前我有 json 对象格式的联系人,你能分享一个链接来创建一个哈希并搜索那个哈希
    • @marmor 目前我根据 last_updated_time_stamp 获取了所有更新的联系人
    • 多次调用意味着它有误报调用(说它改变了,但它没有)。是否也有相反的情况,这意味着即使发生了一些变化,它也没有告诉你?如果是这样,CONTACT_LAST_UPDATED_TIMESTAMP 在所有情况下都完全没用,而且根本不可靠......
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2021-04-15
    • 2013-10-14
    相关资源
    最近更新 更多