Query.equalTo(value)或Query.startAt(value).endAt(value)导致同步延迟

时间:2016-08-19 11:10:18

标签: android firebase firebase-realtime-database

.equalTo()的查询与addListenerForSingleValueEvent一起使用时会返回过时的数据,而删除.equalTo()会导致侦听器返回更新的数据。知道为什么吗?

我使用以下查询从Android系统上启用持久性的实时数据库中获取用户的帖子:

mDatabase.child("posts").orderByChild("uid").equalTo(id)

其中id是当前用户的ID,每个帖子将其作者的ID存储为字段。

如果存在.equalTo(id),则在前几分钟内不会在该查询中返回特定用户的新帖子。更重要的是,它似乎会影响包含.orderByChild的同一根("帖子")的其他查询。例如,以下也无法识别新帖子:

mDatabase.child("posts").orderByChild("archived")

删除.equalTo(id)后,行为恢复正常。我正在使用addListenerForSingleValueEvent。尝试使用addValueEventListener来激活两个事件,一个没有新帖子,一个有它。如果没有.equalTo(id),单个和非单个侦听器都会在第一个回调中返回新帖子。重新启动应用程序似乎并没有立即提供帮助 - 第一个事件在接下来的几分钟内保持过时。新帖子由应用程序的其他部分(例如mDatabase.child("posts").child(id)

中的不同查询成功提取

知道为什么.equalTo()导致这种行为以及如何避免它(除了使用非单一侦听器并忽略第一个事件)?

注1:.startAt(id).endAt(id)

也会发生同样的事情

注意2:实时数据库的其他部分正常运行,设备已连接到互联网,新帖子包含与当前用户匹配的有效uid字段。

2016年10月26日

在尝试查询数据库的一部分时(在我们的例子中,实现无限滚动),调用mDatabase.child("posts").startAt(key).limitToFirst(4)也会产生类似的行为。似乎明确添加.orderByKey()修复了特定问题:mDatabase.child("posts").orderByKey().startAt(key).limitToFirst(4)。 虽然原始问题中概述的问题仍然存在。

1 个答案:

答案 0 :(得分:1)

我遇到了和你一样的问题,经过几乎所有事情的试验,我已经设法解决了这个问题。

我正在扫描条形码并取出带有扫描条形码的食物:

  

查询query = refFoods.orderByChild(“barcode”)。equalTo(barcode);   
query.addListenerForSingleValueEvent(new Value ...})};

根据我的规则

  

“。indexOn”:“['barcode']”

之后我改变了它,然后把“[]”取出来:

  

“。indexOn”:“条形码”

它开始无延迟工作,之前需要花费5分钟才能完成。