- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚实现了一个 CursorLoader,效果很好!事实上,我不相信我的 ListView 会在底层数据发生变化时自动更新,直到我测试它。这显然是 setNotificationUri 的魔力。
我的问题是,它如何知道游标中的数据何时发生了变化?假设我悄悄地在某处插入了一行。底层机制是否不断地查询数据库并与过去的数据进行比较?如果数据集很大,效率会不会非常低?
在我使用游标加载器之前,我会在必要时手动刷新。不用再这样做真是太好了,但是让 CursorLoader 在后台执行此操作是否有效?
最佳答案
如果我在某处错了,请纠正我。
ContentProvider
在 query(…)
方法中调用类似这样的东西:
// Tell the cursor what uri to watch, so it knows when its source data changes
cursor.setNotificationUri(getContext().getContentResolver(), uri);
CursorLoader
取回光标并注册一个观察者。
/* Runs on a worker thread */
@Override
public Cursor loadInBackground() {
Cursor cursor = getContext().getContentResolver().query(mUri, mProjection,
mSelection, mSelectionArgs, mSortOrder);
if (cursor != null) {
// Ensure the cursor window is filled
cursor.getCount();
registerContentObserver(cursor, mObserver);
}
return cursor;
}
/**
* Registers an observer to get notifications from the content provider
* when the cursor needs to be refreshed.
*/
void registerContentObserver(Cursor cursor, ContentObserver observer) {
cursor.registerContentObserver(mObserver);
}
当有人修改数据时,ContentProvider
通知 ContentResolver
有关更改:
getContext().getContentResolver().notifyChange(uri, null);
ContentResolver
依次通知所有注册的观察者。
由 CursorLoader
注册的观察者强制它加载新数据。
关于android - setNotificationUri 的机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802823/
我刚刚实现了一个 CursorLoader,效果很好!事实上,我不相信我的 ListView 会在底层数据发生变化时自动更新,直到我测试它。这显然是 setNotificationUri 的魔力。 我
我从 this tutorial 研究了如何使用 ContentProviders 和 Loaders 我是怎么看的:我们有一个带有 ListView、SimpleCursorAdapter 和 Cu
我有一个自定义的 ContentProvider,它管理对 SQLite 数据库的访问。为了在 ListFragment 中加载数据库表的内容,我将 LoaderManager 与 CursorLoa
我是 android 的新手,谁能告诉我 cursor.setNotificationUri() 和 getContentResolver().notifyChange(uri,null) 在实现时有
我是一名优秀的程序员,十分优秀!