我正在开发一个基于 Google IO presentation 的应用程序使用第一种方法的架构。基本上我有一个 Service
,ContentProvider
由 SQLite
数据库支持,我还使用 Loader
s。
我需要一种在数据库发生更改时更新 UI 的方法。例如,用户可能想将一个项目添加到他的购物篮中。将商品 ID 插入购物篮表后,我想更新 UI。我应该使用什么方法?到目前为止,我看到的关于ContentObserver
的信息很少。这是要走的路吗?
最佳答案
在 ContentProvider
的 query
方法中,将监听器附加到返回的游标:
Cursor cursor = queryBuilder.query(dbConnection, projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
然后在您的insert
/update
/delete
方法中使用如下代码:
final long objectId = dbConnection.insertOrThrow(ObjectTable.TABLE_NAME, null, values);
final Uri newObjectUri = ContentUris.withAppendedId(OBJECT_CONTENT_URI, objectId );
getContext().getContentResolver().notifyChange(newObjectUri , null);
您的 CursorLoader
将收到通知并再次调用 OnLoadFinished(Loader, Cursor)
。
如果您没有使用 Loader
,则可以使用 ContentObserver
,只需几行代码即可通知您在数据库更改时(但您需要手动重新查询)。
private ContentObserver objectObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
restartObjectLoader();
}
};
记得调用onResume()
:
getContentResolver().registerContentObserver(ObjectProvider.OBJECT_CONTENT_URI, false, objectObserver);
在 onPause()
中:
getContentResolver().unregisterContentObserver(objectObserver);
更新:UI 更改
这是一个更大的主题,因为它取决于您用来填充 ListView
或 RecyclerView
的 Adapter
。
游标适配器
在 onLoadFinished(Loader 加载器, Cursor 数据)
mAdapter.swapCursor(data);
数组适配器
在 onLoadFinished(Loader 加载器, Cursor 数据)
Object[] objects = transformCursorToArray(data); //you need to write this method
mAdapter.setObjects(objects); //You need to wrie this method in your implementation on the adapter
mAdapter.notifyDataSetChange();
RecyclerView.Adapter
在 onLoadFinished(Loader 加载器, Cursor 数据)
Object[] objects = transformCursorToArray(data); //you need to write this method
//Here you have more mAdapter.notify....()
阅读from here用于通知 RecyclerView.Adapter
的不同方式。
关于android - 发生数据库更改后更新 UI 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312005/