私は SQLite DB からのデータを表示するアプリを持っており、データは常に変化しているため、明らかに、LoaderManager を使用してデータを表示する必要があると考えました。
SQLite で LoaderManager を使用することについて少し読んで、 CursorLoader の実装と使用に関するAlex Lokwood の回答を見ました。また、ContentProvider の代わりに CursorLoader を SQLite DB に直接使用することに関するこの回答を見て、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」から変更されたときに始まります。
基本的に私が探しているのは、データベースの変更をリアルタイムで監視することですが、そうです(また、dbを再クエリしたいときに関数を呼び出す必要があるAndroidドキュメントから)。restartLoader
舞台裏で再クエリを自動化する方法はありますか?
アップデート:
私の最初の考えは、次のようなローダーを再起動する関数を作成することでした:
public static void restartLoader(Context context){
context.getSupportLoaderManager().restartLoader(0, null, LandingPageActivity.this);
}
しかし、それは下手で、これを行う最善の方法ではないようです。