从Firebase实时数据库中获取指定的子级

时间:2019-05-13 06:27:14

标签: java android firebase-realtime-database

Firebase Strucutre

我正在尝试检索基于Messages/child排序的time。我可以访问Messages/child。我找不到任何有用的解决方案。请帮我解决这个问题。

我当前的代码是:

FirebaseDatabase.getInstance()
    .getReference()
    .child("Messages")
    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(@NonNull DataSnapshot dataSnapshot,  @Nullable, String s) {

              Log.d("children",dataSnapshot.getKey());
              users_list.add(dataSnapshot.getKey());

          }

3 个答案:

答案 0 :(得分:1)

据我所知,您有一个数据结构:

Messages: {
  uid1: {
    uid2: {
      messageId1: ...
      messageId2: ...
      messageId3: ...
    }
  }
}

您将ChildEventListener附加到/Messages/uid1上,这意味着您的onChildAdded被从JSON调用为用户二级UID。要获取各个消息,您仍然需要遍历DataSnapshot的子节点:

FirebaseDatabase.getInstance()
    .getReference()
    .child("Messages")
    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(@NonNull DataSnapshot dataSnapshot,  @Nullable, String s) {
              for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                  Log.d("message key: ", messageSnapshot.getKey());
                  Log.d("message time: ", messageSnapshot.child("time").getValue(String.class));
              }
          }

一些注意事项:

  • 如前所述,该代码在DataSnapshot的子级上循环以获取各个消息。
  • 考虑将数据存储为聊天室,其中每个聊天室的密钥基于参与者的UID,如此处所述:Best way to manage Chat channels in Firebase
  • 您将需要将邮件添加到列表中,并在客户端对其进行排序。
  • 您将时间存储为显示字符串,这使得对它们进行排序变得更加困难。考虑以更易于排序的格式存储它们,例如"20190513T073306"或使用时间戳记例如1557758003677

答案 1 :(得分:0)

您可以这样:-

mChatReference = FirebaseDatabase.getInstance().getReference("Messages")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        Query query = mChatReference.orderByChild("time");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                   Log.d("children",dataSnapshot.getKey());
                users_list.add(dataSnapshot.getKey());            
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

答案 2 :(得分:0)

尝试一下。

DocumentReference docRef = FirebaseFirestore.getInstance().collection(YOUR_COLLECTION).document(FirebaseAuth.getInstance().getCurrentUser().getUid());
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {

                if (document.contains("message")) {
                        String message=document.get("message").toString());
                    }
                //add other information to your user_list
            }
        }
    }
});