[英]Room - LiveData observer does not trigger when database is updated
[英]How does LiveData know when data is changed in Room Database?
我在android中學習Mvvm模式,我不明白一件事。 實時數據如何知道房間數據庫中數據何時發生變化? 我有這個代碼:
分段:
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如何知道我們在表中有新用戶並且回調Observer所有者數據已經更改?
在Android Room代碼中潛水后,我發現了一些東西:
間注釋處理器從室溫注解(生成代碼@Query
, @Insert
使用...) javapoet庫
根據查詢的結果類型( QueryMethodProcessor ),它使用“binder”或另一個。 在LiveData
的情況下,它使用LiveDataQueryResultBinder 。
LiveDataQueryResultBinder
生成一個LiveData
類,其中包含一個InvalidationTracker.Observer類型的字段_observer
,負責監聽數據庫更改。
然后,基本上,當數據庫中有任何更改時, 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) {
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.