2016-09-21 88 views
1

不工作在我的Android應用我使用下面的代碼OrderByChild()在Android客戶端

FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    ref = database.getReference().child(Keys.CONTACTIFY_CONTACTS).child(sharedPrefs.getString(SharedPreferenceValues.CURRENT_USER_UID, "")).child(Keys.SHARED_CONTACTS); 
    refer = ref.orderByChild(Keys.TIME); 
refer.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       ArrayList<HashMap<String, Object>> sharedList = new ArrayList<HashMap<String, Object>>(); 
       if (dataSnapshot.getValue() != null) { 
        Object[] rootData = ((HashMap<String, Object>) dataSnapshot.getValue()).values().toArray(); 
        for (Object singleElement : 
          rootData) { 
         HashMap<String, Object> eachElement = (HashMap<String, Object>) singleElement; 
         sharedList.add(eachElement); 
        } 
        recyclerView.setAdapter(new SharedItemsRecyclerViewAdapter(sharedList, mListener, getActivity())); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

我的火力數據庫結構

enter image description here

我的火力地堡規則相關的情況是

{ 
    "rules": { 
    "mapper":{ 
     ".read": "auth!= null", 
     ".write": "auth!= null" 
    }, 
     "share_id_mapper":{ 
     ".read": "auth!= null", 
     ".write": "auth!= null" 
    }, 
     "contactify_contacts":{ 
         //can read a message if authenticated 
       "$uid": { 
        "shared_contacts": {".indexOn": "time", 
          ".write": "auth!= null", 

問題是我得到了hasmap從默認的排序方式,即sortbyKey()快照。但我期待基於節點數據中時間鍵值的結果。

回答

2

當您針對Firebase數據庫執行查詢時,DataSnapshot返回包含鍵值,值和結果的訂單

但隨後將快照轉換爲Map

((HashMap<String, Object>) dataSnapshot.getValue()) 

此時火力地堡客戶端沒有其他選擇,而不是下降有關結果的順序的信息。

對此的解決辦法是遍歷快照的孩子從DataSnapshot方法,然後才轉換值:

public void onDataChange(DataSnapshot dataSnapshot) { 
    List<String, Object> data = new ArrayList<String,Object>(); 
    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
     data.add(childSnapshot.getKey(), childSnapshot.getValue()); 
    } 
} 

我們最近增加的這一個樣品給我們query documentation

+0

雖然有效,但是 List data = new ArrayList (); 是有點混淆,但休息是好的;-)。 –

+0

如何顛倒默認順序,如上升或下降? –

+0

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#reverse(java.util.List) –