2017-08-09 51 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