当我在 Firebase 实时数据库中调用 push() 时重复 child

Duplicate child when i call push() in Firebase Realtime Database

我正在尝试从 Firebase 实时数据库检索数据并将此数据添加到列表视图。当我调用 push() 时,firebase 会生成两个 children(一个在另一个里面),它们具有相同的唯一键。这是我的数据库的结构:

database

我就是这样保存数据的:

RunningSession runningSession = new RunningSession(date, activityTime, pace, timeElapsed,
                                finalDistance, image, tipe);

DatabaseReference reference = databaseReference.child("users").child(userUid).child("activities").push();

Map<String, Object> map = new HashMap<>();
map.put(reference.getKey(),runningSession);
reference.updateChildren(map);

这是我检索数据的方式(导致空指针异常):

DatabaseReference reference = databaseReference.child("users").child(userId).child("activities");
reference.addValueEventListener(new ValueEventListener() {
       @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
             list.clear();
             for (DataSnapshot snpshot : snapshot.getChildren()) {
                    RunningSession run = snpshot.getValue(RunningSession.class);
                    list.add(run);
             }
        }

       @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
   });

   ListViewAdapter adapter = new ListViewAdapter(this, list);
   ListView activityItems = (ListView) findViewById(R.id.activityList);
   activityItems.setAdapter(adapter);

您收到了重复的推送 ID,因为您将它们添加到参考中两次。如果您只需要一个,那么只需使用以下代码行:

RunningSession runningSession = new RunningSession(date, activityTime, pace, timeElapsed, finalDistance, image, tipe);
DatabaseReference reference = databaseReference.child("users").child(userUid).child("activities");
String pushedId = reference.push().getKey();
reference.child(pushedId).setValue(runningSession);

阅读代码可保持不变