OrderByChild()无法在Android客户端中运行

时间:2016-09-21 11:44:30

标签: android firebase firebase-realtime-database firebase-security

在我的Android应用程序中,我使用以下代码

+0

我的firebase数据库结构是

enter image description here

与方案相关的我的Firebase规则是

 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) {

            }
        });

问题是我以默认排序方式从快照获取hasmap,即sortbyKey()。但我期望结果基于节点数据中的时间键值。

1 个答案:

答案 0 :(得分:2)

当您对Firebase数据库执行查询时,它返回的DataSnapshot包含结果的键,值和顺序

但是您将快照转换为Map

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

此时,Firebase客户端除了删除有关结果顺序的信息外别无选择。

解决方法是使用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添加了一个示例。