top of page

[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している。

あなたの買い物をサポートする
アプリ Shop Plan

iphone6.5p2.png

​いつ何を買うかの計画を立てられるアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

靴を大切にしよう!靴管理アプリ SHOES_KEEP

納品:iPhone6.5①.png

靴の履いた回数、お手入れ回数を管理するアプリです。

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

「後で読む」を忘れないアプリ ArticleReminder

気になった​Webサイトを登録し、指定時刻にリマインダを送れるアプリです

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png
bottom of page