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

Posted

技术标签:

【中文标题】Android 联系人:是不是可以使用 URN 引用给定的联系人条目?【英文标题】:Android Contacts: Is it possible to reference a given contact entry using a URN?Android 联系人:是否可以使用 URN 引用给定的联系人条目? 【发布时间】:2015-09-18 00:02:59 【问题描述】:

让我试着澄清一下我的意图。

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

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

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

我的问题是:

Android Provider 的联系人数据中是否使用了唯一的记录键,就像 Provider 的联系人条目本身一样?与 Contact._ID 等效的电话号码或电子邮件地址?

如果不这样做,Android 联系人提供程序是否会存储上次修改的日期和时间?我希望如果我无法在提供程序中引用联系人数据,我至少可以运行检查以查看自从选择在应用程序中使用联系人以来是否有任何变化,从而允许我的应用程序提醒用户数据已更改。

【问题讨论】:

【参考方案1】:

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

例如-

扩展 contentObserver-

public class Contact_change extends ContentObserver

注册内容观察者-

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

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

【讨论】:

感谢您的更新建议。我会根据我的代码对其进行调整,并尽快对其进行一些测试。【参考方案2】:

因此,在查看可能发生的情况时,我通过将本地化记录转储到我的平板电脑,发现了一些有趣的发现。

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

到目前为止,我已经使用 Android Contacts Provider 检索了一个联系人,它返回联系人的数据,包括后面的字段

ContactsContract.Contacts._ID
ContactsContract.Contacts.DISPLAY_NAME

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

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

纠正错误并重新运行查询后,我发现了 CONTACT_ID 的一系列记录,每个记录都有自己唯一的 _ID(照片和二进制数据除外,它们都有一个空引用_ID。

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

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

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

更新:

更多调查表明,与给定联系人条目关联的 UID 是通过条目编辑保留的。

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

其他人想要引用联系人提供程序中的单个条目的结果是它是可能的,您可以只存储 _ID 并仍然检索提供程序中的单个条目。

【讨论】:

以上是关于Android 联系人:是不是可以使用 URN 引用给定的联系人条目?的主要内容,如果未能解决你的问题,请参考以下文章

既不是 URL 也不是 URN 的 URI 是不是存在?

是否有使用域名的 URN 方案?

URIURLURN区别与联系含义等

如何检测是不是已在android中访问过联系人

C++学习(二九七)Android的URI URL URN Uri

所有的 URL 都是 URN 吗?