即使游标中没有任何更改,也会调用ContentObserver

时间:2012-02-07 10:10:55

标签: android contentobserver

我有一个内容观察者,当我的同步适配器添加的其中一个联系人被修改时,应该会通知他。 我注册并取消注册观察者:

private static final Uri MYAPP_CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, SyncAdapter.MYAPP_ACCOUNT_NAME).appendQueryParameter(RawContacts.ACCOUNT_TYPE, MY_APP_ACCOUNT_TYPE).build();

public static void registerContentObserver() {
    ContentResolver resolver = MyApplication.getAppContext().getContentResolver();
    cursorContacts = resolver.query(MYAPP_CONTENT_URI, null, RawContacts.DELETED + "=0", null, null);
    cursorContacts.registerContentObserver(MYAPP_URI_OBSERVER);
}

public static void unregisterContentObserver() {
    if (cursorContacts != null) {
        cursorContacts.unregisterContentObserver(MYAPP_URI_OBSERVER);
        cursorContacts.close();
    }
}

问题是,即使在我注册观察者之后光标为空(getCount返回0),我也会调用onChange在本机地址簿中执行的操作。 只有当光标中的一个条目被修改时,才会调用观察者? 文档说明:

  

注册在支持此游标的内容发生更改时调用的观察者

什么是“支持此光标的内容”?我认为它是光标中联系人的lookupuri列表,但看起来它足以在ContactsContract.RawContacts.CONTENT_URI中进行更改。

我还尝试为每个Uri注册一个观察者。它没有帮助。虽然ContentResolver.registerContentObserver的文档声明:

  

注册一个观察者类,当给定内容URI标识的数据发生变化时,它会获得回调。

Parameters
        uri  The URI to watch for changes. This can be a specific row URI, or a base URI for a whole class of content. 
        notifyForDescendents  If true changes to URIs beginning with uri will also cause notifications to be sent. If false only changes to the exact URI specified by uri will cause notifications to be sent. If true, than any URI values at or below the specified URI will also trigger a match. 

(我将notifyForDescendents设置为false,但在任何情况下都不应该调用观察者。)

怎么了? 感谢您

2 个答案:

答案 0 :(得分:1)

由内容提供商决定何时报告更改。对于复杂的内容提供者(如联系人提供者),确定因操作而发生变化的所有特定URI非常困难,因此他们只会在发生事件时报告全局更改。

答案 1 :(得分:0)

当Observer Uri匹配发生时,会考虑Uri,Fragment,甚至Scheme中的查询参数。唯一重要的是Uri Authority和Path Segments。发生严格的从左到右匹配。我没有测试过" *"在路径段中表示通配符,但我怀疑它不起作用。

您的特定观察者是ContactsContract.RawContacts.CONTENT_URI,因此当任何联系人内容因任何原因发生变化时,您的观察者都会触发。