Firebase onDataChange给出了奇怪的结果(在java中)

时间:2014-07-08 14:22:12

标签: java firebase corrupt

假设我有两个客户A和B. 他们每个人都会在几毫秒之内向firebase写一条消息。 写入" AAA",B写入" BBB"。 让我们假设A&#39的消息首先到达那里。

然后是客户A:

onDataChange()

  1. "一些消息"

  2. "另一条消息"

  3. " AAA"

  4. onDataChange()

    1. "一些消息"

    2. "另一条消息"

    3. " AAA" < ---正确为" AAA"是第一次

    4. " BBB"

    5. 但对于客户B:

      onDataChange()

      1. "一些消息"

      2. "另一条消息"

      3. " BBB"

      4. onDataChange()

        1. "一些消息"

        2. "另一条消息"

        3. " AAA" < ---正确为" AAA"是第一次

        4. " BBB"

        5. 因此,您可以看到每个客户端第一次获取数据时,会收到不同的数据。 刚刚发送了正确的数据,但是,这个第一次收到的数据在某些时候会破坏我的程序工作。 无论如何要解决这个问题吗?

          感谢您的帮助。


          好的,我让它运转了,但现在我又被卡住了

          之前我在Firebase引用上使用了push(),因此它提供了类似... -Qj73473429的内容,然后我的数据(key-> value)就在它之下。这很好,因为它按照它的顺序排序。

          但现在使用Transaction,我必须使用MutableData对象,而不是Firebase对象。我无法使用push,因此数据(key->值)按键按字母顺序排序,这对我没有好处。

          你知道我怎么解决这个问题,我尝试应用md.setPriority(1),但它似乎没有什么区别。

          这很烦人,只是一个接一个的问题,arghh。

          如果可以,请帮忙

1 个答案:

答案 0 :(得分:1)

由于我们正在讨论通过网络空间飞行的实时比特,因此无法保证哪些订单消息会到达客户端。 Firebase不是试图保证不可能,而是明确地告诉您每个新记录的前一个孩子是什么。

来自reading data下的示例。请注意prevChildName字符串:

Firebase usersRef = new Firebase("https://SampleChat.firebaseIO-demo.com/users/");
usersRef.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
    String userName = snapshot.getName();
    System.out.println(userName + " was added after " + previousChildName);
  },

  /* other methods ... */
});

这在上面的段落中有所阐述,虽然没有直接说明它也适用于child_added事件:

  

在您的客户端上触发的事件并不总是对应的   完全与在其他上执行的写操作   客户端。例如,如果另外两个客户端设置相同的部分   大约在同一时间的数据,不能保证两个   将在您的本地客户端上触发事件。取决于   时机,这两个变化可以汇总到一个本地   事件。无论如何,最终所有客户都将拥有一致的视图   即使在流程中触发的事件可能不同,也会对数据进行处理   从客户到客户。