Android 联系人:是否可以使用 URN 引用给定的联系人条目?

Android Contacts: Is it possible to reference a given contact entry using a URN?

让我试着阐明我的意图。

我正在开发一个可以访问 Android 联系人提供程序的应用程序。我已经实现了一种机制,用于从联系人提供程序中提取联系人并将结果存储在 SQLite table 中。目前,当我查询联系人 _ID 的结果时,我可以检索该联系人的所有数据、phone 号码、电子邮件地址等

但是,为了指定我的应用在未来的场合应该使用哪些,我必须将生成的联系人数据(例如 CommonDataKinds.Phone.NUMBER、CommonDataKinds.Phone.TYPE 等)存储在 SQL table.

如果 Android 联系人提供程序中的数据已更改,则会出现问题。我考虑过的一种解决方案是重新查询 _ID 并存储已更改的数据。但是,实施此类解决方案需要收集该联系人的所有数据,因此很难确定要使用的正确联系人数据。

我的问题是:

Android 提供商的联系人数据中是否使用了唯一的记录键,就像提供商的联系人条目本身一样?等同于 Contact._ID?

的 phone 号码或电子邮件地址

否则,Android 联系人提供程序是否存储最后修改的日期和时间?我希望,如果我不能在提供者中引用联系人数据,我至少可以 运行 检查以查看自从联系人被选择用于应用程序后是否有任何更改,从而允许我的应用程序提醒用户数据已更改。

Yoi 可以在服务的帮助下使用 ContentObserver 来监视联系人更改或更新。

例如-

扩展 contentObserver-

public class Contact_change extends ContentObserver

注册 contentobserver-

Contact_change changeObserver = new Contact_change();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true,chageobserver);

通过使用它,您可以监控联系人更改并更新您的数据库。

因此,在寻找可能性的同时,我通过对我的 tablet 进行本地化记录转储,发现了一些有趣的发现。

我在提问时错误地提到了 phone _ID。它在那里,但它引用了任何给定联系人中的个人记录。这可能有用,可能正是我所希望的,但也可能是死路一条。

到目前为止,我已经使用 Android 联系人提供程序检索了联系人,returns 联系人的数据包括后面的字段

ContactsContract.Contacts._ID
ContactsContract.Contacts.DISPLAY_NAME

将 _ID 分配给字符串并在查询中使用它后,我最初在 ContactsContract.Data._ID 字段中搜索 _ID,但没有按预期工作。

那时我才意识到我做错了。我需要将搜索应用到 ContactsContract.Data.CONTACT_ID,然后它会检索我选择的联系人的所有相关数据记录。

更正错误并重新运行我的查询后,我找到了 CONTACT_ID 的一系列记录,每条记录都有自己唯一的 _ID(照片和二进制数据,它们都具有对 _ID 的空引用。

现在的问题是:即使 phone 号码、电子邮件地址或 IM 条目被修改(而不是删除并重新创建),此数据引用是否也会更改?我可能会通过进一步测试找出答案,但我想问一下是否有人已经先尝试过这个。

最终,我希望我的内部 SQL table 可以仅存储每个条目的 CONTACT_ID 和 _ID,依靠对 Android 提供者的回调来拉取相关值。这样,我可以确定我的应用程序中显示的数据在应用程序和设备上存储的联系人数据之间是最新的。

结合此处提供的更改通知程序代码,我应该能够提醒用户可能需要他们采取行动的任何更改。

更新:

更多调查显示与给定联系人条目关联的 UID 通过条目编辑得以保留。

UID明显是删除丢失了,我简单的测试也没有发现UID被回收了。这至少为我解决了引用完整性问题,因为 UID 不会突然引用另一条记录。

对于任何其他想要引用联系人提供程序中的单个条目的人来说,结果是这是可能的,您可以仅存储 _ID 并仍然检索提供程序中的单个条目。