【问题标题】:Way to update UI after database change has occured发生数据库更改后更新 UI 的方法
【发布时间】:2014-12-05 08:49:00
【问题描述】:

我正在使用第一种方法开发基于Google IO presentation 架构的应用程序。基本上我有一个ServiceContentProvider,由SQLite DB 支持,我也使用Loaders。

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

【问题讨论】:

  • 购物篮中的商品与数据库中的插入操作相结合?
  • 不太清楚你的意思,但基本上在 http 请求完成后,我更新了数据库表中的相应行,该状态应该以某种方式被 UI 镜像。我的问题是我似乎无法找到一种方法来告诉 UI 在数据库数据更改后进行更新。
  • 更新行后是否调用了 notifyChange?
  • 您的 sql 查询是否位于适配器中?还是仅将数组列表提供给适配器?

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


【解决方案1】:

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);

更新:用户界面更改 这是一个更大的主题,因为它取决于您用来填充ListViewRecyclerViewAdapter

光标适配器onLoadFinished(Loader loader, Cursor data)

 mAdapter.swapCursor(data);

阵列适配器onLoadFinished(Loader loader, Cursor data)

 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 loader, Cursor data)

 Object[] objects = transformCursorToArray(data); //you need to write this method
 //Here you have more mAdapter.notify....()

阅读from here 了解通知RecyclerView.Adapter 的不同方式。

【讨论】:

    【解决方案2】:

    如果您使用的是列表,您可以再次填充适配器并将其设置到您的列表中。或者尝试通知数据集的变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多