【发布时间】:2016-10-26 16:53:32
【问题描述】:
我对@987654321@ 的查询在与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)。
尽管原始问题中概述的问题仍然存在。
【问题讨论】:
标签: android firebase firebase-realtime-database