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

时间:2015-07-01 01:10:26

标签: android sqlite android-contacts

让我试着澄清我的意图。

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

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

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

我的问题是:

Android提供商的联系人数据中是否使用了唯一的记录密钥,其方式与提供商的联系人条目本身相同?电话号码或电子邮件地址相当于Contact._ID?

如果失败,Android联系人提供商会存储上次修改的日期和时间吗?我希望如果我不能在提供商中引用联系人数据,我至少可以检查自从选择在应用程序中使用联系人之后是否有任何更改,允许我的应用程序提醒用户数据已经改变。

2 个答案:

答案 0 :(得分:1)

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

例如 -

扩展contentObserver -

public class Contact_change extends ContentObserver

注册contentobserver -

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

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

答案 1 :(得分:0)

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

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

到目前为止,我已经使用Android联系人提供程序检索了一个联系人,该联系人返回联系人的数据,包括以下字段

ContactsContract.Contacts._ID
ContactsContract.Contacts.DISPLAY_NAME

在将_ID分配给字符串并在查询中使用它之后,我最初在ContactsContract.Data._ID字段中搜索了_ID,该字段无法正常工作。

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

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

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

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

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

更新

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

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

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