会议室和Livedata误报通知

时间:2019-05-14 12:21:37

标签: java android-room android-livedata

我正在观察来自聊天屏幕活动的以下查询:

@Query("SELECT * FROM messages where conversationId = :conversationId order by id desc")
LiveData<List<Message>> getMessagesByConversationId(long conversationId);

因此,如果有消息要发送给该对话ID,我的观察者将收到通知。但是问题是我发现我的观察者正在通知,即使有消息传到另一个对话ID。我猜这对于大表来说是个大问题,因为行太多了,并且每当一条消息到达另一个对话时,我的查询就会运行。我认为这是无效的。

我如何才能更有效地完成此过程?

2 个答案:

答案 0 :(得分:0)

您可以使用分页中代表的逻辑来检索所有数据。

 routes.MapRoute(
            name: "Default",
            url: "{*.}",
            defaults: new { controller = "Home", action = "Index" , product = UrlParameter.Optional}
        );

和getMessagesByConversationId

您可以使用

@Query("SELECT * FROM messages where conversationId = :conversationId order by id desc limit  :numberOfData :pageNumber")
LiveData<List<Message>> getMessagesByConversationId(long conversationId,long numberOfData,long pageNum);

您将更快地获得最少的数据..

快乐编码

答案 1 :(得分:0)

房间仅知道该表已被修改,但不知道为什么以及发生了什么变化。因此,在重新查询之后,查询结果由remove_zeros = [ '10'[x==remove_zeros[-1]]+x for x in remove_zeros ] LiveData发出。

由于房间不会在内存中保存任何数据,并且无法假定对象具有Flowable,因此无法判断这是否是相同的数据。 您需要确保equals()可以过滤辐射并且仅对不同的对象做出反应。

如果可观察查询是使用DAO实现的,请使用Flowable#distinctUntilChanged

Flowables

在此处查找更多实施详细信息:7 Pro-tips for Room

@Dao
abstract class UserDao : BaseDao<User>() {

    /**
    * Get a user by id.
    * @return the user from the table with a specific id.
    */

    @Query(“SELECT * FROM Users WHERE userid = :id”)
    protected abstract fun getUserById(id: String): Flowable<User>

     fun getDistinctUserById(id: String): Flowable<User> = getUserById(id)
                                  .distinctUntilChanged()

}

根据distinctUntilChanged() 比较,返回一个Flowable,该Flowable发出源发布者发出的与其直接前任不同的所有项目。