频繁更新 SQLite DB 和 Listview(效率)
Frequently updating SQLite DB and Listview (efficiency)
我正在开发一个依赖数据库(本地)的应用程序 - 这个数据库经常更新。
我想要实现的是:
假设数据显示在列表视图中。我希望列表视图在 数据库中发生任何更改时立即 更新数据集(或者准确地说是特定的 table)。
到目前为止我想到了这些选项:
- SQLiteOpenHelper class:每当 update/insert 完成时,它会通知 activity 通过 BroadcastReceiver 更新列表视图。
- 带有 CursorLoader 的 ContentProvider(之前没用过所以有点怀疑)
- 还有别的吗?请提出建议。
在不阻塞 UI(性能)的情况下实现一致和即时更新的最佳方法是什么?
按照@Karakuri 的建议,通过扩展 CursorLoader class 而不使用 ContentProvider 创建了自定义 CursorLoader。
解决方法如下:
CustomCursorLoader.class
public class CustomCursorLoader extends CursorLoader {
private final ForceLoadContentObserver forceLoadContentObserver = new ForceLoadContentObserver();
public CustomCursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public Cursor loadInBackground() {
Cursor cursor = /* get cursor from DBHandler class */;
cursor.setNotificationUri(getContext().getContentResolver(), CONTENT_URI);
if (cursor != null) {
cursor.getCount();
cursor.registerContentObserver(forceLoadContentObserver);
}
return cursor;
}
}
每次对数据库进行更改时,请执行:
getContentResolver().notifyChange(CONTENT_URI, null);
在Activity class:
实现接口LoaderManager.LoaderCallbacks<Cursor>
启动加载器getLoaderManager().initLoader(0, null, this);
并覆盖这些方法:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CustomCursorLoader(this, CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
customCursorLoaderAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
customCursorLoaderAdapter.swapCursor(null);
}
扩展 CursorAdapter
class 以创建列表视图适配器,您就完成了。
如果性能对您的应用至关重要,您应该查看 Realm for Android 数据库。它提供比 SQLite 更好的效率,您可以使用 RealmChangeListener
来监听数据库中的变化。
我正在开发一个依赖数据库(本地)的应用程序 - 这个数据库经常更新。
我想要实现的是: 假设数据显示在列表视图中。我希望列表视图在 数据库中发生任何更改时立即 更新数据集(或者准确地说是特定的 table)。
到目前为止我想到了这些选项:
- SQLiteOpenHelper class:每当 update/insert 完成时,它会通知 activity 通过 BroadcastReceiver 更新列表视图。
- 带有 CursorLoader 的 ContentProvider(之前没用过所以有点怀疑)
- 还有别的吗?请提出建议。
在不阻塞 UI(性能)的情况下实现一致和即时更新的最佳方法是什么?
按照@Karakuri 的建议,通过扩展 CursorLoader class 而不使用 ContentProvider 创建了自定义 CursorLoader。
解决方法如下:
CustomCursorLoader.class
public class CustomCursorLoader extends CursorLoader {
private final ForceLoadContentObserver forceLoadContentObserver = new ForceLoadContentObserver();
public CustomCursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public Cursor loadInBackground() {
Cursor cursor = /* get cursor from DBHandler class */;
cursor.setNotificationUri(getContext().getContentResolver(), CONTENT_URI);
if (cursor != null) {
cursor.getCount();
cursor.registerContentObserver(forceLoadContentObserver);
}
return cursor;
}
}
每次对数据库进行更改时,请执行:
getContentResolver().notifyChange(CONTENT_URI, null);
在Activity class:
实现接口LoaderManager.LoaderCallbacks<Cursor>
启动加载器getLoaderManager().initLoader(0, null, this);
并覆盖这些方法:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CustomCursorLoader(this, CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
customCursorLoaderAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
customCursorLoaderAdapter.swapCursor(null);
}
扩展 CursorAdapter
class 以创建列表视图适配器,您就完成了。
如果性能对您的应用至关重要,您应该查看 Realm for Android 数据库。它提供比 SQLite 更好的效率,您可以使用 RealmChangeListener
来监听数据库中的变化。