簡體   English   中英

LiveData如何知道房間數據庫中何時更改數據?

[英]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代碼中潛水后,我發現了一些東西:

  1. 間注釋處理器從室溫注解(生成代碼@Query@Insert使用...) javapoet

  2. 根據查詢的結果類型( QueryMethodProcessor ),它使用“binder”或另一個。 LiveData的情況下,它使用LiveDataQueryResultBinder

  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM