web-dev-qa-db-ja.com

Android SimpleCursorAdapterはデータベースが変更されても更新されません

データベースListActivityを介してCursorを介したAndroid SimpleCursorAdapterがあります。

アイテムをクリックすると、データベースの対応する行のフラグフィールドが切り替えられ、リストのビューを更新する必要があります。

問題は、更新されたビューが画面外に出てリサイクルされると、ビューに戻ったときに古い値がビューに表示されることです。 thrリストがredrawb(向きの変更など)になるたびに同じことが起こります。

notifydatasetchanged()を使用してカーソルアダプターを更新しますが、効果がないようです。

カーソルも更新されるように、データベースをどのように更新する必要がありますか?

43

Cursor(またはCursorを介したCursorのように、ListViewが取り込むもの)に反映するデータベース内のデータを変更する場合、CursorAdapterrequery()を呼び出します。

Cursorは、ODBCクライアント側カーソル-クエリ結果によって表されるすべてのデータを保持します。したがって、データベース内のデータを変更したからといって、Cursorは保持しません。 requery()で更新しない限り、これらの変更について知ってください。


[〜#〜] update [〜#〜]:この質問全体と回答のセットは古いため削除する必要がありますが、それは明らかに不可能です。 Android回答を求めている人は、Androidは迅速に移動するターゲットであり、2009年からの回答は一般的に新しい回答よりも悪いことに注意してください。

現在の解決策は、新しいCursorを取得し、CursorAdapterchangeCursor()またはswapCursor()のいずれかを使用して、データ変更に影響を与えることです。

90
CommonsWare

requeryは非推奨になりました。 ドキュメント から:

このメソッドは非推奨です。これを使わないでください。新しいカーソルをリクエストするだけです。これにより、非同期でこれを実行し、新しいカーソルが戻ったらリストビューを更新できます。

新しいカーソルを取得した後、theadapter.changeCursor(cursor)を使用できます。これにより、ビューが更新されます。

38
rony l

ローダーと自動生成されたカーソルを使用する場合、次を呼び出すことができます。

getLoaderManager().restartLoader(0, null, this);

アクティビティで、DBで何かを変更した直後に、新しいカーソルを再生成します。イベントハンドラも定義することを忘れないでください:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    CursorLoader cursorLoader =
            new CursorLoader(this,
                    YOUR_URI,
                    YOUR_PROJECTION, null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    adapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    adapter.swapCursor(null);
}
21
siefca

CursorAdapterのautoRequeryプロパティをtrueに設定したかどうかはわかりません。

アダプターはautoRequeryプロパティを確認します。 falseの場合、カーソルは変更されません。

1
gjican

それは簡単です。

private Db mDbAdapter;
private Cursor mCursor;
private SimpleCursorAdapter mCursorAd;

.....................................
//After removing the item from the DB, use this
.....................................

 mCursor = mDbAdapter.getAllItems();
 mCursorAd.swapCursor(mCursor);

またはCursorLoaderを使用...

0
Shwarz Andrei

requery()は既に非推奨です。CursorAdapterの子クラスに次のような単純なupdateUI()メソッドを実装し、データの更新後に呼び出してください:

private void updateUI(){
    swapCursor(dbHelper.getCursor());
    notifyDataSetChanged();
}
0
Jaroslav