android - 发生数据库更改后更新 UI 的方法

标签 android android-sqlite android-contentprovider android-loader

我正在开发一个基于 Google IO presentation 的应用程序使用第一种方法的架构。基本上我有一个 ServiceContentProviderSQLite 数据库支持,我还使用 Loaders。

我需要一种在数据库发生更改时更新 UI 的方法。例如,用户可能想将一个项目添加到他的购物篮中。将商品 ID 插入购物篮表后,我想更新 UI。我应该使用什么方法?到目前为止,我看到的关于ContentObserver 的信息很少。这是要走的路吗?

最佳答案

ContentProviderquery 方法中,将监听器附加到返回的游标:

 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 更改 这是一个更大的主题,因为它取决于您用来填充 ListViewRecyclerViewAdapter

游标适配器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.AdapteronLoadFinished(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/

相关文章:

java - 存储应用程序的数据?

在 Samsung galaxy Note 中使用时,Android Zxing 代码抛出异常?

java - Android sqlite语法错误: near ")"

kotlin - 在 session 室数据库中使用 'like'搜索加密的文本

java - 在 Android ContentProvider 中从网络同步时防止网络同步循环

android webview 渲染显示一个白页

android - 如何以编程方式一劳永逸地获取android屏幕大小?

android - 多个 SQLite 表无法正常工作

Android 将 ContentProvider 分发为与应用程序 bundle 在一起的库

Android:观察已删除线程的短信