【问题标题】:How to observe database delete events with Architecture Components如何使用架构组件观察数据库删除事件
【发布时间】:2017-10-11 14:56:26
【问题描述】:

我有一个如下的 DAO。

@Dao
public interface PostDAO {
    @Query("SELECT * FROM posts order by time DESC")
    LiveData<List<Post>> getPosts();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    @NonNull
    void insert(Post... posts);

    @Delete
    void delete(Post post);

    @Query("SELECT * FROM posts WHERE id = :id")
    Post getPost(String id);

    @Query("SELECT * FROM posts WHERE id = :id")
    LiveData<Post> getPostLiveData(String id);
}

我知道我可以通过以下方式监听新添加的数据。

postDAO().getPosts().observe(builder.getLifecycleOwner(), data::postValue)

但我怎么知道帖子何时被删除?

【问题讨论】:

    标签: java android android-sqlite android-room android-architecture-components


    【解决方案1】:

    LiveData&lt;List&lt;Post&gt;&gt; getPosts(); 返回一个 LiveData,它由任何 insertupdatedelete 更新到 Post 表。

    因此,如果您最初是在观察列表,那么您已经在观察插入/更新/删除。

    【讨论】:

    【解决方案2】:

    您观察所有项目 (LiveData&lt;List&lt;Post&gt;&gt;) 并在发生变化时立即收到有关新数据的通知。

    您可能想要使用新的DiffUtil,它可以向您显示受影响的更改。

    另一种方法是在删除后设置/更新 LiveData 的值。返回 Long 表示返回删除的行数。

    @Delete void delete(Post post) : Long
    
    LiveData data = new MutableLiveData<Post>()
    if (yourDao.delete(yourItem) > 0) data.setValue( yourItem ) 
    

    我在Android Room : LiveData callback of update insert?写了一个为什么 Delete and Insert 不使用 LiveData 的答案

    【讨论】:

    • 您在编辑之前关于使用 Single 的回答能否在评论中详细说明。
    • 不知道你的意思 :-) 您可以使用某种 DiffUtil (或 android 提供的帮助器)检查更改,也可以使用我使用另一个 MutableLiveData 发布的尝试数据发生变化时立即通知。取决于用例。如果您有一个“大”列表,那么使用新的 LiveData 对象的方法是最好的方法。
    • 鼓励在 setValue() 上使用“DiffUtil 例程”不是明智之举吗?我一直在使用 data.setValue();,但在 post 中,有些地方不太对劲。
    • 我明白。我以为我在编辑之前看到了与 Single 相关的内容。无论如何,我明白你的意思。
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多