2016-09-21 23 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) –