频繁更新 SQLite DB 和 Listview(效率)

Posted

技术标签:

【中文标题】频繁更新 SQLite DB 和 Listview(效率)【英文标题】:Frequently updating SQLite DB and Listview (efficiency) 【发布时间】:2015-12-06 19:56:08 【问题描述】:

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

我想要实现的是: 假设数据显示在列表视图中。我希望列表视图一旦发生数据库中的任何更改(或者确切地说是特定表)更新数据集。

到目前为止,我已经想到了这些选项:

    SQLiteOpenHelper 类:每当更新/插入完成时,它都会通知活动通过 BroadcastReceiver 更新列表视图。 ContentProvider 和 CursorLoader(之前没用过,所以有点怀疑) 还有别的吗?请提出建议。

在不阻塞 UI(性能)的情况下实现一致和即时更新的最佳方式是什么?

【问题讨论】:

选项 2 是你的朋友 使用 CursorLoader。您不一定需要 ContentProvider,您可以编写自己的 CursorLoader 直接查询您的数据库,而不是使用 ContentResolver 谢谢!最后用自定义 CursorLoader 安顿下来。将分享解决方案... 【参考方案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 类以创建列表视图适配器,您就完成了。

【讨论】:

这里的 CONTENT_URI 的导入类型是什么? 注意,我必须使用 getSupportLoaderManager().initLoader(0, null, this);【参考方案2】:

如果性能对您的应用至关重要,您应该查看Realm for android 数据库。它提供了比 SQLite 更好的效率,您可以使用RealmChangeListener 来监听数据库的变化。

【讨论】:

以上是关于频繁更新 SQLite DB 和 Listview(效率)的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite DB 中使用 Drag-Sort ListView

android studio中ListView与SQLite的结合使用

ListView 未根据 sqlite 中的名称显示可绘制对象中的正确图像

Android - 添加到 SQLite 数据库后不会更新 ListView,除非重新启动应用程序

查询案例的 SQlite listview 结果

如何在片段中访问 SQLite 数据到 ListView