【问题标题】:OrderByChild() not working in Android ClientOrderByChild() 在 Android 客户端中不起作用
【发布时间】:2016-09-21 22:02:05
【问题描述】:

在我的 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) {

            }
        });

我的firebase数据库结构是

我的与场景相关的 Firebase 规则是

    {
  "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()。但我期待基于节点数据中时间键值的结果。

【问题讨论】:

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


    【解决方案1】:

    当您对 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 中添加了一个示例。

    【讨论】:

    • 可以,但是 List data = new ArrayList();有点令人困惑,但休息还可以;-)。
    • 颠倒默认顺序如升序或降序怎么样?
    • 这就是我所做的,但我希望可能有一些 firebase 查询,无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多