发生数据库更改后更新用户界面的方法

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

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

Solutions Collecting From Web of "发生数据库更改后更新用户界面的方法"

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就是要走的路,只需要几行代码就可以通过db的变化得到通知(但是你需要手动查询)。

  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 loader, Cursor data) CursorAdapter onLoadFinished(Loader loader, Cursor data)

  mAdapter.swapCursor(data); 

ArrayAdapteronLoadFinished(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....() 

从这里读取不同的方式来通知RecyclerView.Adapter

如果您正在使用列表,则可以再次填充适配器并将其设置为列表。 或尝试通知数据集更改。