2017-08-09 55 views
1

为什么我从Firebase数据库中检索的列表未与orderByKey()订购?Firebase数据库ArrayList未订购

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
transactions = mDatabase.child("balance").child("users").child(userid).child("log").orderByKey(); 
transactions.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot snapshot) { 

     Map<String, Object> td = (HashMap<String,Object>) snapshot.getValue(); 
     ArrayList<Object> values = new ArrayList<Object>(); 
     values.addAll(td.values()); 
     Log.d("Transactions", values.toString()); 
    } 

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

ArrayList“values”是无序的。

这是JSON格式的结构的例子:

"balance" : { 
    "users" : { 
     "log" : { 
      "-Kp0plO6zBeulHQ8S1Fj" : { 
       "In" : 100 
      }, 
      "-Kp0qHM73Mcwbli1gaK6" : { 
       "Out" : -100 
      }, 
      "-Kp0qgkORJx5sTi2rUZf" : { 
       "In" : 100 
      }, 
      "-Kp1OCdSpUA7SEZhVoPR" : { 
       "In" : 100 
      }, 
      "-Kp1OdtuuF6z_zlNj2St" : { 
       "In" : 100 
      } 
     } 
    } 
} 
+0

请顺序由键添加数据库结构 –

+0

@AlexMamo添加 – Bostrot

+0

而你要还是?这Kp0plO6zBeulHQ8S1Fj,Kp0qHM73Mcwbli1gaK6键? –

回答

2

当您从Firebase检索集合时,它会为每个子节点接收三条信息:

  1. 孩子
  2. 孩子
  3. 孩子

当你在当前的代码中调用snapshot.getValue()的相对顺序的价值的关键,你告诉火力地堡将其转换成一个Map<String, Object>。由于Map是无序的,因此Firebase客户端会保留键和值,但会丢失子项的顺序。

要确保你保持秩序,必须使用DataSnapshot.getChildren()处理结果:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
transactions = mDatabase.child("balance").child("users").child(userid).child("log").orderByKey(); 
transactions.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot snapshot) { 
     ArrayList<Object> values = new ArrayList<Object>(); 
     for (DataSnapshot child: snapshot.getChildren)) { 
     values.addAll(child.getValue()); 
     } 
    } 
1

达到你需要改变这一行代码你想要什么:

transactions = mDatabase.child("balance").child("users").child(userid).child("log").orderByKey(); 

transactions = mDatabase.child("balance").child("users").child(userid).child("log").orderByChild("In"); 
+0

谢谢,但我的列表仍然无序;在使用orderByChild(“In”)之后。 – Bostrot

+0

您的所有孩子是否都拥有“J”文件中的“In”而不是“Out”键?因为如果不一样,订单将不起作用。 –

+0

是的,你是对的。有一个孩子有另一个名字。也可以订购吗? – Bostrot