【问题标题】:Android Room - how to get the new data only?Android Room - 如何仅获取新数据?
【发布时间】:2019-04-28 16:45:05
【问题描述】:

在数据库中插入一些messages 后,这个Dao 方法的结果是什么:

@Query("SELECT * FROM messages")
Flowable<List<Message>> getMessages();

1 - ALL 存储在数据库中的messages 将在此更改后发出

2 - 更改后只会发出 DIFFERENCE beetwen new 和 old messages?

在哪些文件中指定?如果首先,我应该怎么做才能有所作为 - 类似DiffUtils 或有其他方法?

附:如果我删除一些消息怎么办?

【问题讨论】:

    标签: android rx-java android-room rx-android android-diffutils


    【解决方案1】:
    1. 所有存储在数据库中的消息都会被发出。
    2. 要获得差异,推荐的方法是使用您提到的DiffUtils。有很多关于它如何工作以及如何实现它的信息。在这里只提几个你有这个Mindorks' tutorial@iammert tutorial
    3. 如果您不想在每次更改时获取所有消息,您可以编写不同的查询。这取决于您的用例,但例如,如果您知道旧消息不会更改,则可以有一个查询返回某个日期之后的所有消息。
    4. 如果你删除了一些消息,查询的结果将会改变。因此,您将再次发出所有消息。
    5. 我会改用LiveData&lt;List&lt;Message&gt;&gt;。行为是相同的,您无需担心处置订阅,也无需担心配置更改。但是,当您必须返回单个结果时,我会使用 SingleMaybe

    更新:您可以检索消息的子集并按需更新,而不是使用 DiffUtils 获取所有消息并查看它们之间的差异。新的Paging library in Android 可以帮助您做到这一点。同样,关于如何执行此操作的信息很多,因此我不会在此处介绍实现的详细信息,因为它超出了问题的范围,但这里有 one of the many tutorials 可用。

    【讨论】:

    • 如果所有消息都被发出并且DiffUtils没有改变这种情况,可能会导致巨大的无用内存消耗......
    • @isabsent true,但如果您继续使用该查询,则没有其他选择。但是,如果您通过使用附加参数(获取特定日期之后的消息)来限制查询结果,甚至可以更好地使用分页策略(您可以使用 android 提供的 Paging 库),则可以使您的应用程序更高效
    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多