如何使用LoaderManager自动重新查询

时间:2012-11-20 12:02:06

标签: android android-sqlite android-loadermanager commonsware-cwac

我有一个应用程序显示来自SQLite数据库的数据并且数据不断变化,所以显然,我认为我应该使用LoaderManager来显示数据。

我是否读过一些关于在SQLite中使用LoaderManager的内容,并看到Alex Lokwood's answer关于实现CursorLoader并使用它,我看到this answer关于直接使用CursorLoader到SQLite DB而不是ContentProvider并开始使用commonsware的Loaderex

我创建了这个类来显示ListView中的数据:

public class LandingPageActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
    ListView list;
    SimpleCursorAdapter mAdapter;

    private SQLiteCursorLoader loader = null;
    private Context mContext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_friends_and_threads);
        list = (ListView) findViewById(R.id.list);
        mContext = LandingPageActivity.this;

        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null,
                new String[] { Properties.Title.columnName }, new int[] { android.R.id.text1 }, 0);

        list.setAdapter(mAdapter);
        getSupportLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        Context c = mContext;
        String query = "SELECT * FROM TABLE_NAME";
        SQLiteOpenHelper db = DatabaseHelper.getDatabase();
        loader = new SQLiteCursorLoader(c, db, query, null);
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
        mAdapter.changeCursor(arg1);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        mAdapter.changeCursor(null);
    }
}

当活动仍在运行时,从“BroadcastListener”更改数据库时,问题就开始了。

基本上我正在寻找的是实时观察数据库的变化,但似乎(当我想重新查询时,我需要调用restartLoader函数的Android Documentation db)。

有没有办法在幕后自动重新查询?

更新:

我最初的想法是创建一个重启加载器的函数,如下所示:

public static void restartLoader(Context context){
    context.getSupportLoaderManager().restartLoader(0, null, LandingPageActivity.this);
}

但这似乎很糟糕,而不是最好的方法。

1 个答案:

答案 0 :(得分:0)

  

当活动仍在运行时,从“BroadcastListener”更改数据库时问题开始...有没有办法在幕后自动重新查询?

BroadcastReceiver使用insert()上的update()replace()delete()SQLiteCursorLoader方法来修改数据库。然后,Cursor将自动重新加载。