0

sqlite テーブルから行を削除すると、ListView は常に最後のエントリを削除して更新されます。アクティビティを再開すると、データベースの内容が正しく反映されます。

これは、テーブルから行を削除する方法です (mDb は SQLiteOpenHelper オブジェクトです)。

mDb.delete(TABLE, COL_ID + "=" + id, null);
mContext.getContentResolver().notifyChange(DB_URI, null);

そして、これがリストが更新される方法です(簡略化されています)。onLoadFinished() が呼び出されることを確認しました。

public class MyActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {

…

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.calllist);

        String[] from = new String[] { … };
        int[] to = new int[] { ... };

        notes = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0){
    }


    public final static class MyCursorLoader extends SimpleCursorLoader {
        final Loader.ForceLoadContentObserver observer = new ForceLoadContentObserver();

        @Override
        public Cursor loadInBackground() {
            Cursor c = mDb.rawQuery(SELECT_ALL, null);
            c.registerContentObserver(this.observer);
            c.setNotificationUri(getContext().getContentResolver(), DB_URI);
            return c;
        }

    }


    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        if (loader.getId() == LOADER_ID) {
            notes.changeCursor(cursor);
            notes.notifyDataSetChanged();
        }
    }
}

notifyChange(DB_URI, null) 呼び出しを 1 秒以上遅らせるとうまくいくようです。それは必要でしょうか?これを解決する他の方法はありますか?

4

1 に答える 1