当前位置: 首页 > 知识库问答 >
问题:

从多个路径获取Firebase数据库中的数据

魏翰
2023-03-14

我有一个问题,从多个路径从Firebas eDatabase获取数据。我正在编写一个Endomondo克隆,我有一个数据库结构如下:

users:
    user_1:
        name:
        ....
        friends:
            user_2
            user_3
    user_2:
        ...
workouts:
    user_1:
        workout_1:
            distance:
            duration:
            path:
            etc.
    user_2:

现在我想在feed选项卡中列出我朋友的所有锻炼。所以要做到这一点,我需要做三件事。

1)遍历我的配置文件(user_1)以获取我所有朋友的ID。

2)当我拥有这些ID时,我需要迭代它们的配置文件以获得它们的名称来显示。

3)遍历锻炼以获得我朋友的所有锻炼。
现在我想把所有这些信息放在一个对象中,让我们说“FriendWorkout”,它看起来像:

FriendWorkout:
    String friendName;
    Workout workout; // contains all workout data(path, time, distance)

并将所有这些对象放入列表中,这样我就可以将其传递给适配器。

JSON:

{
  "users" : {
    "BLhXU5eJGtZayRrUGYTrGiImg313" : {
      "avatarUrl" : "https://firebasestorage.googleapis.com/v0/b/alphaui-40ee2.appspot.com/o/avatars%2Favatars%2FBLhXU5eJGtZayRrUGYTrGiImg313.jpg?alt=media&token=c6b00937-6970-4f43-8ea4-b9add33c43e1",
      "email" : "xhh@gmail.com",
      "firstName" : "Jadwiga",
      "friends" : {
        "CTS134a7vtMWcBs7N2ynDKSyKj23" : true,
        "DoXUtoa7vtMWcBs7N2ynDKSyKj23" : true
      },
      "lastWorkout" : "-LRGN8H6a1esdUPvb-ve",
      "surname" : "Szalony"
    },
    "CTS134a7vtMWcBs7N2ynDKSyKj23" : {
      "avatarUrl" : "none",
      "email" : "ofca@wp.pl",
      "firstName" : "Leokadia",
      "friends" : {
        "BLhXU5eJGtZayRrUGYTrGiImg313" : true
      },
      "lastWorkout" : "dasdsa",
      "surname" : "Fin"
    }
  },
  "workouts" : {
    "BLhXU5eJGtZayRrUGYTrGiImg313" : {
      "-LRGN3sEJgrNxRH3Hf6j" : {
        "date" : "Wed, 14 Nov 2018 09:39:41",
        "distance" : 0,
        "duration" : "0:00",
        "workoutName" : "Running"
      },
      "-LRGN68Z_s5dUjlkuhB-" : {
        "date" : "Wed, 14 Nov 2018 09:39:50",
        "distance" : 0,
        "duration" : "0:00",
        "workoutName" : "Running"
      }
    },
    "DoXUtoa7vtMWcBs7N2ynDKSyKj23" : {
      "-LRGSafxbmKWGLy5x-Kd" : {
        "date" : "Wed, 14 Nov 2018 10:03:50",
        "distance" : 0,
        "duration" : "0:02",
        "workoutName" : "Running"
      }
    }
  }
}

共有1个答案

左丘曦
2023-03-14

您需要的东西可以通过查询数据库三次来解决,一次是得到frienduid,第二次是得到相应的names,第三次是得到相应朋友的workout对象。所以请使用以下几行代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference friendsRef = rootRef.child("users").child(uid).child("friends");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String friendUid = ds.getKey();

            DatabaseReference friendUidRef = rootRef.child("users").child(friendUid);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        String firstName = ds.child("firstName").getValue(String.class);
                        String surname = ds.child("surname").getValue(String.class);
                        String friendName = firstName + " " + surname;
                        Log.d(TAG, friendName);

                        DatabaseReference friendUidWorkoutsRef = rootRef.child("workouts").child(friendUid);
                        ValueEventListener listener = new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                List<FriendWorkout > workouts = new ArrayList<>(); //List added
                                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                                    Workout workout = ds.getValue(Workout.class);
                                    Log.d(TAG, workout.getWorkoutName());

                                    //Create an object of FriendWorkout as needed
                                    FriendWorkout friendWorkout = new FriendWorkout(friendName, workout);
                                    workouts.add(friendWorkout); //Add object to the list
                                }
                                ListView listView = (ListView) findViewById(R.id.list_view);
                                ArrayAdapter<Data> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, list);
                                listView.setAdapter(arrayAdapter); //Set the adapter
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {
                                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                            }
                        };
                        friendUidWorkoutsRef.addListenerForSingleValueEvent(listener);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                }
            };
            friendUidRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
friendsRef.addListenerForSingleValueEvent(valueEventListener);
 类似资料:
  • 有人能帮我做这个吗?

  • 一切正常,但DatabaseReference无法获取数据,这就像是忽略了我的代码运行,就像我的internet无法运行一样,请帮助我,我是这个社区的新手,下面是我的代码和图片。 以前它是工作的,但由于我只是更改了一些代码,使只有currentVersion>=vCode,这样即使数据库中的值是 firebase数据库映像 mainactivity.java manifest.xml 依赖关系

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我正在尝试获取我的用户名,并在应用程序打开时向他/她问好。但我无法根据某个用户的uid获取数据。当我运行应用程序时,祝酒词从未真正出现。 数据库结构 密码

  • 问题内容: 我正在研究Firebase项目,我在其中将用户信息存储在表中。现在,我的要求是在表中显示所有用户。这是我的数据库快照 我可以使用从数据库中获取所有用户 上面的代码向我返回了包含bod,电子邮件,姓名,性别的用户数组。但是我只想获取电子邮件和用户名。 有没有一种方法只能从数据库中获取指定的字段? 问题答案: 读取节点时,必须检索其全部内容。因此,无法从读取路径时返回的数据中仅获取 特定

  • 我想从Firebase实时数据库中获取整个JSON数组。从实时数据库中提取数组并将其存储在自定义类的ArrayList中。