在ContentObserver类中,方法onChange传递一个布尔值selfChange,定义为:"如果更新是由对正在观察的光标的提交调用引起的,则为true."
更新光标以使selfChange设置为true的正确方法是什么?我当前的代码根本没有引用光标进行更新,因此selfChange总是为false.
ContentValues values = new ContentValues();
values.put("date", date.getTime());
getContentResolver().update(URI, values, "_id = " + id, null);
Run Code Online (Sandbox Code Playgroud)
Android框架没有提供通过静态ContentResolver#update()方法执行此操作的方法.
说明
当ContentResolver#notifyChange(Uri,ContentObserver)使用ContentObserver对象作为启动更改的观察者调用时,ContentObserver将onChange()调用selfChangeset为true
来自文档:
void android.content.ContentResolver.notifyChange(Uri uri,ContentObserver observer)
参数:
uri已更改内容的uri.
observer发起更改的观察者可能为null.发起更改的观察者只有在通过实施ContentObserver.deliverSelfNotifications()以请求接收自我更改通知才会收到通知.
因此,如果您notifyChange()从ContentProvider更新/插入/删除方法中调用,而这些方法又是从ContentResolver更新/插入/删除方法调用的,那么您将没有ContentObserver传递给的引用notifyChange(),因此不会selfChange设置为true.
解决方法
如果ContentProvider与客户端代码处于同一进程中,则此方法有效.它需要一个自定义的ContentProvider和一个更复杂/容易出错的调用update/insert/delete方法.
我们可以在派生ContentProvider中创建自定义方法,将其ContentObserver作为参数.例如,如果我们想要使用update()方法调用notifyChange(),ContentObserver我们会执行以下操作:
public class MyContentProvider extends ContentProvider {
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// Just call our new method with 'null' as the ContentObserver
update(uri,values,selection,selectionArgs,null);
}
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs, ContentObserver changeOriginator){
// Do the update
...
// Notify the change with the ContentObserver that wants to ignore it
getContext().getContentResolver().notifyChange(uri,changeOriginator);
}
Run Code Online (Sandbox Code Playgroud)
要使用新方法,您必须从中获取ContentProvider对象ContentResolver并调用我们的新update()方法:
ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider();
MyContentProvider mCP = (MyContentProvider)cP;
mCP.update(URI, values, "_id = " + id, null, contentProvider);
Run Code Online (Sandbox Code Playgroud)
嘿,我遇到了同样的问题。你的 onChange() 方法工作正常吗?您必须在 onChange() 方法范围内调用您想要执行的操作。
我就是这么做的,而且效果很好!当光标发生某些变化时它会发出通知。
| 归档时间: |
|
| 查看次数: |
6158 次 |
| 最近记录: |