Firebase .getvalue与数据库的顺序不同

时间:2016-10-16 08:21:35

标签: java firebase firebase-realtime-database

我的Firebase数据库就像这样

Firebase Database

当下面的代码运行时:

String loc=(snapshot.child("loc").getvalue()).tostring();

我得到的输出与数据库的顺序不同:

Output

为什么会这样?

2 个答案:

答案 0 :(得分:3)

Firebase数据存储为JSON,并且本质上是无序的。

如果要按特定顺序访问数据,则应为查询指定orderBy子句,并使用快照的getChildren()方法访问数据。

假设您要按升序键记录项目:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getRef();
Query locations = rootRef.orderByKey();
locations.addListenerForSingleValueEvent(new ValueEventListener() {
  public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot locSnapshot: snapshot.getChildren()) {
        System.out.println(locSnapshot.getKey() + ": " + locSnapshot.getValue(String.class));
    }
  }

  public void onCancelled(DatabaseError databaseError) {
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    // ...
  }
});

此示例来自({3}}。

来自(修改)

答案 1 :(得分:1)

弗兰克打败了我的编辑,请使用orderBy....

查看他的正确解决方案

您需要使用forEach而不是child方法(或child.foreach

以下是doc:

的摘录
  

由于JavaScript对象的工作方式,数据的排序   val()返回的JavaScript对象不保证与   服务器上的排序以及child_added事件的排序。那是   其中forEach()派上用场。它保证了孩子们   DataSnapshot将按其查询顺序进行迭代。

来源:https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach