你能用registerContentObserver确定联系人的变化吗?

时间:2011-02-16 18:03:35

标签: android contacts contentobserver

在使用registerContentObserver或其他方法时,只是尝试确定是否有一种简单的方法来确定哪些联系人发生了变化?我可以告诉数据库何时更改,但不确定每次更新/更改发生时我都要检查所有记录。

基本上,如果我有一个联系人列表,一个通过手动方式更新(即我更改联系人的电话号码或添加新联系人),或自动(说ActiveSync照片被添加,更改)。我希望能够A)知道某些事情发生了变化,并且B)知道哪些联系人的某些数据发生了变化。

我正在尝试寻找某些用户,以便我可以在远程服务中匹配他们的照片。如果有更多信息添加到用户帐户,我希望能够检查它以查看它是否提供匹配。我不想安排它,我想在更新发生后这样做。

克里斯。

2 个答案:

答案 0 :(得分:7)

我不确定您目前正在注册哪个Uri更新,但是当您注册ContentObserver时,您是否只能注册一个直接指向您感兴趣的联系人的个人Uri?然后,您的观察者只会在您修改有趣的联系人时收到通知。 SDK文档标题“查找URI”中的部分详细介绍了这一点:

http://developer.android.com/resources/articles/contacts.html

查找键对于每个记录(行)都是唯一的,所以我想像你这样做的东西是什么?

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
getContentResolver().registerContentObserver(lookupUri, false, myObserver);

为列表中的每个联系人执行此操作。

添加联系人

我可以看到这样做的最好方法是每次ContentObserver更改时重新查询光标到Contacts表(重新查询速度很快,即使你经常使用很多数据),并保持最高的已知CONTACT_ID值。每当光标包含超出您存储的ID时,就会添加它。

此外,如果您还没有看过this conversation,那可能是一个很好的阅读。 Dianne似乎非常相信他们会将内容更改的细节保留在ContentObserver

之外

干杯。

答案 1 :(得分:1)

由于回答了这个问题,ContentObserver类中有一个新的回调方法,其中包含已更改内容的uri:http://developer.android.com/reference/android/database/ContentObserver.html#onChange(boolean,android.net.Uri)

从Android API Level 16开始提供此功能