[Android]SQLiteDataBaseの更新がviewに反映されない
現象
SQLiteDataBaseをContentProviderで読み取ってRecyclerViewに一覧表示している。データベースの内容を更新してもそれがRecyclerViewに反映されない。
原因
ContentProviderのquery()メソッドでsetNotificationUri()メソッドを呼び出していなかった。
このメソッドでcursorにデータのuriが紐づけられ、CursorLoaderでuriを見てくれるようになる。ContentProviderのinsert(), update(), delete()メソッドでgetContext().getContentResolver().notifyChange()を呼びだすと、データの変更が通知され、CursorLoaderが再読み込みをしてくれる(という理解)。
今回の場合は、notifyChange()は呼び出していたが、setNotificationUri()を忘れるとそもそも監視するuriが設定されないということなのかな?
(詳しくはこちら)
ContentProvider
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
//~略~
cursor.setNotificationUri(getContext().getContentResolver(), uri);
//↑これを忘れない
return cursor;
}
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
//~略~
getContext().getContentResolver().notifyChange(uri, null);
//↑これを忘れない
return Uri.withAppendedPath(uri, String.valueOf(id));
}
最新記事
すべて表示課題 androidのBottomNavigationを使用したアプリを作っている。ページを移動して戻って来た時にTextViewなどに書き込んだデータを保存しておきたい。 問題点 通常ActivityやFragmentを離れて戻って来た時にviewの内容などを保存したいときはonSaveInstanceState()でBundleにデータを保存し、戻って来た時にonCreateView()などで
現象 データベースからデータを読み取ってRecyclerViewで一覧表示をしたい。データベースには複数登録されているはずなのに、RecyclerViewには1つしか表示されない。前回と違い、RecyclerView.AdapterのgetItemCount()は適切に設定されている。 原因 個々のviewをxmlファイルで定義して、コンストラクタのnewViewメソッドでinflateしている。