【问题标题】:Query.equalTo(value) or Query.startAt(value).endAt(value) causes delay in syncQuery.equalTo(value) 或 Query.startAt(value).endAt(value) 导致同步延迟
【发布时间】:2016-10-26 16:53:32
【问题描述】:

我对@9​​87654321@ 的查询在与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


    【解决方案1】:

    我遇到了和你完全相同的问题,在尝试了几乎所有东西之后,我终于设法解决了它。

    我正在扫描条形码并获取具有扫描条形码的食物:

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

    按照我的规则,我有

    ".indexOn": "['条形码']"

    在我改变它并取出“[]”之后:

    ".indexOn": "条码"

    它开始无延迟地工作,而在此之前它需要大约 5 分钟才能更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多