我正在观察来自聊天屏幕活动的以下查询:
@Query("SELECT * FROM messages where conversationId = :conversationId order by id desc")
LiveData<List<Message>> getMessagesByConversationId(long conversationId);
因此,如果有消息要发送给该对话ID,我的观察者将收到通知。但是问题是我发现我的观察者正在通知,即使有消息传到另一个对话ID。我猜这对于大表来说是个大问题,因为行太多了,并且每当一条消息到达另一个对话时,我的查询就会运行。我认为这是无效的。
我如何才能更有效地完成此过程?
答案 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发出源发布者发出的与其直接前任不同的所有项目。