web-dev-qa-db-ja.com

ルームデータベースでデータが変更されたとき、LiveDataはどのようにして知るのですか?

AndroidでMvvmパターンを学習していますが、1つのことを理解できません。ルームデータベースでデータが変更されたときにライブデータはどのようにして知るのですか?私はこのコードを持っています:

断片:

_ newUserViewModel.getListItemById(itemId).observe(this, new Observer<User>() {
        @Override
        public void onChanged(@Nullable User user) {
            tv.setText(user.getName());
        }
    });
_

モデルを見る:

_ public LiveData<User> getListItemById(String itemId){       
    return repository.getListItem(itemId);
}
_

リポジトリ:

_ public LiveData<User> getListItem(String itemId){
    return userDao.getUSerByID(itemId);
}
_

DAO:

_@Query("SELECT * FROM User WHERE itemId = :itemId")
LiveData<User> getUSerByID(String itemId);// When this query gets executed and how live Data knows that our Table is changed?
_

データベースに新しいユーザーを挿入したとしましょう。データベースに新しいデータがあるときに@Query("SELECT * FROM User WHERE itemId = :itemId")が実行されるのはいつですか?)LiveDataは、テーブルに新しいユーザーがいることをどのようにして認識し、データが変更されたことをオブザーバーコールバックにコールバックしますか?

12
Nikolas Bozic

Android Room code でダイビングした後、いくつかのことがわかりました。

  1. ルームアノテーションプロセッサは javapoet ライブラリを使用して、ルームアノテーション(@Query@Insert...)からコードを生成します

  2. クエリの結果タイプ( QueryMethodProcessor )に応じて、「バインダー」または別のバインダーを使用します。 LiveDataの場合は、 LiveDataQueryResultBinder を使用します。

  3. LiveDataQueryResultBinderは、データベースの変更をリッスンするタイプ InvalidationTracker.Observer のフィールド_observerを含むLiveDataクラスを生成します。

次に、基本的に、データベースに変更があると、LiveDataが無効になり、クライアント(リポジトリ)に通知されます。

14
Héctor

Daoに、通知のみに使用するクエリを追加します。

@Query("SELECT * FROM my_table")
public LiveData<List<MyItem>> changeNotif();

そしてあなたの活動でこのような変化を聞いてください:

LiveData<List<MyItem>> items = AppDatabase.getAppDatabase().itemDao().changeNotif();
items.observe(this, new Observer<List<MyItem>>() {
    @Override
    public void onChanged(List<MyItem> myItems) {
    }
});
0
Babao