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

时间:2014-12-05 08:49:01

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

我正在使用第一种方法开发基于Google IO presentation架构的应用。基本上我有一个由Service数据库支持的ContentProviderSQLite,我也使用Loader s。

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

2 个答案:

答案 0 :(得分:7)

query的{​​{1}}方法中,将一个侦听器附加到返回的游标:

ContentProvider

然后在您的 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); Adapter的{​​{1}}。

<强>的CursorAdapter ListView

RecyclerView

<强> ArrayAdapter onLoadFinished(Loader loader, Cursor data)

 mAdapter.swapCursor(data);

<强> RecyclerView.Adapter 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();

以不同的方式阅读from here以通知onLoadFinished(Loader loader, Cursor data)

答案 1 :(得分:2)

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