使用按键作为父节点从 firebase 检索子节点值

时间:2021-05-25 19:37:19

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

我在从 firebase 数据库中检索数据时遇到问题。数据以这种方式排列,在我的根引用节点中,我有一个子节点作为“FirstReply”,它有子节点作为消息 ID,对于每个消息 ID,有内部节点(推键)和值,如图所示。

enter image description here

我想在每个PushID节点中检索子sellerID的值,并想和当前的userID进行比较,但是当我写这样的代码时

RootRef.child("FirstReply").child(Enquiry_MessageID).
    addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot snapshot) {
      String returnSellerID=  snapshot.child("sellerId").getValue().toString();
      if(returnSellerID==current_user_Id) {
         //my remaining code

      }

        }

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

        }
    });

我收到如下错误:

<块引用>

java.lang.NullPointerException: 尝试在空对象引用上调用虚方法“java.lang.String java.lang.Object.toString()”

我的应用程序崩溃了。我可以在每个实例中都有 messageID 的值,但在每种情况下推送值都不同。我的问题有解决方案吗?

1 个答案:

答案 0 :(得分:1)

您必须遍历您获得的 snapshot 的子节点:

RootRef.child("FirstReply").child(Enquiry_MessageID).addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot snapshot) {
    for (DataSnapshot child: snapshot.getChildren()) { // ? loop over the child nodes
      String returnSellerID = child.child("sellerId").getValue().toString();
      if(returnSellerID.equals(current_user_Id)) { // ? use equals to compare strings
        //my remaining code
      }
    }
  }

  @Override
  public void onCancelled(@NonNull DatabaseError error) {
    throw error.toException(); // ? never ignore errors
  }
});