我.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)
。
虽然原始问题中概述的问题仍然存在。
答案 0 :(得分:1)
我遇到了和你一样的问题,经过几乎所有事情的试验,我已经设法解决了这个问题。
我正在扫描条形码并取出带有扫描条形码的食物:
查询query = refFoods.orderByChild(“barcode”)。equalTo(barcode);
query.addListenerForSingleValueEvent(new Value ...})};
根据我的规则
“。indexOn”:“['barcode']”
之后我改变了它,然后把“[]”取出来:
“。indexOn”:“条形码”
它开始无延迟工作,之前需要花费5分钟才能完成。