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は、テーブルに新しいユーザーがいることをどのようにして認識し、データが変更されたことをオブザーバーコールバックにコールバックしますか?
Android Room code でダイビングした後、いくつかのことがわかりました。
ルームアノテーションプロセッサは javapoet ライブラリを使用して、ルームアノテーション(@Query
、@Insert
...)からコードを生成します
クエリの結果タイプ( QueryMethodProcessor )に応じて、「バインダー」または別のバインダーを使用します。 LiveData
の場合は、 LiveDataQueryResultBinder を使用します。
LiveDataQueryResultBinder
は、データベースの変更をリッスンするタイプ InvalidationTracker.Observer のフィールド_observer
を含むLiveData
クラスを生成します。
次に、基本的に、データベースに変更があると、LiveData
が無効になり、クライアント(リポジトリ)に通知されます。
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) {
}
});