android - OrderByChild() 在 Android 客户端中不工作

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

在我的 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数据库结构是

enter image description here

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

最佳答案

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

关于android - OrderByChild() 在 Android 客户端中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615658/

相关文章:

java - Firebase for Android,我如何遍历一个 child (对于每个 child = x do y)

android - 如何仅使屏幕的一部分变暗/模糊?

android - 当对话框被关闭时执行 UI 相关任务的正确方法是什么

android - 发送密码重置电子邮件方法会使应用程序崩溃

android - Firebase 崩溃报告 - 它现在支持 NDK 吗?

java - Firebase 添加 fab 按钮时出现问题无法删除条目

java - Firebase 数据不断循环

android - Ionic apk 签名错误

java - Android 应用程序中的 setOnClickListener 错误

ios - 如何使用 Swift 在 Firebase 中查询最近的用户?