经常更新SQLite DB和Listview(效率)

时间:2015-09-10 13:34:47

标签: android sqlite listview android-listview android-contentprovider

我正在开发一个依赖于数据库(本地)的应用程序 - 而且这个数据库经常更新。

我想要达到的目标是: 假设数据显示在列表视图中。我希望listview在数据库发生任何更改后立即更新数据集(或者确切地说是特定的表)。

到目前为止,我已经考虑过这些选项:

  1. SQLiteOpenHelper类:每当完成更新/插入时,它都会通过BroadcastReceiver通知活动更新列表视图。
  2. 带有CursorLoader的ContentProvider(之前没有使用它,所以有点怀疑)
  3. 别的什么?请提出建议。
  4. 哪种方法可以在不阻止UI(性能)的情况下实现一致且即时的更新?

1 个答案:

答案 0 :(得分:1)

正如@Karakuri所建议的那样,通过在不使用ContentProvider的情况下扩展CursorLoader类来创建自定义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类中:

实现接口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类以创建listview适配器,您已完成。