【问题标题】:Observe the change of selected attributes of objects in LiveData观察 LiveData 中对象选中属性的变化
【发布时间】:2019-09-21 04:26:27
【问题描述】:

我正在观察以下 LiveData:

书道:

@Query("SELECT * FROM books")
LiveData<List<Book>> getBooks();

在片段中,我是这样观察的(简化):

viewModel.getBooks().observe(getViewLifecycleOwner(), b -> adapter.setBooks(b));

一切正常,adapter 显示所有书籍。但是,当 db(favourite 列)中的标志更改时,我需要禁用刷新。换句话说,当任何一本书被标记为收藏时,我不希望observer 运行。除了favourite 列之外,有什么方法可以观察book 的所有列?向observer 添加条件不是一个好主意,因为将新状态与先前状态进行比较会导致O(n^2) 复杂性。谢谢。

【问题讨论】:

  • 我怀疑这是可能的。当一个表被更新时,Room 被通知该表已更改,但它不知道表的哪一部分已更改。您已经提到 diff 不是一种选择。为Favourite 创建一个单独的表,或者仅在这种情况下不使用LiveData 怎么样?

标签: android-room observer-pattern android-livedata


【解决方案1】:

换句话说,当任何一本书被标记为收藏时,我不希望观察者运行。

您可以在获得第一个查询后使用.removeObserver()

有没有什么办法可以观察到除了喜欢的栏目之外的所有书籍栏目?

在 Dao 中编写一个 sql 查询来执行此操作,然后观察它,例如:

SELECT Title, Body FROM TABLENAME;

【讨论】:

  • 我需要观察者,但不需要 favourite 标志(即当名称更改时,我想观察此更改)。只有两列的查询也不适合我,因为我必须知道favourite 标志的第一个值。
猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2014-04-18
相关资源
最近更新 更多