【问题标题】:How to retrieve the sibling node's value in firebase?如何在firebase中检索兄弟节点的值?
【发布时间】:2018-03-05 16:56:35
【问题描述】:

我要做的是返回名为m1 的节点的名为class 的键的值,其兄弟名为name


这是我的数据库的样子


这是我的代码的样子

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Medicines");
        final Query userQuery = rootRef.orderByChild("name").equalTo(textView.getText().toString());

        userQuery.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                String myParentNode = dataSnapshot.getKey();
                for (DataSnapshot child: dataSnapshot.getChildren())
                {
                    String key = child.getKey().toString();
                    String value = child.getValue().toString();

                    txt1.setText(myParentNode);

                    DatabaseReference childRef = FirebaseDatabase.getInstance().getReference().child(myParentNode);
                childRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        String class_ = dataSnapshot.getValue().toString();         txt2.setText(class_);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });
            }
            }

但是它只是给了我错误T.T

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    试试这个:

     DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Medicines");
        final Query userQuery = rootRef.orderByChild("name").equalTo(textView.getText().toString());
    
        userQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot datas: dataSnapshot.getChildren()){
       String keys=datas.getKey();
       String class=datas.child("class").getValue().toString();
       String name=datas.child("name").getValue().toString();
      }
     }
        @Override
      public void onCancelled(DatabaseError databaseError) {
      }
      });
    

    datasnasphoto 是 medicines,那么查询是 orderByChild("name").equalTo(textView.getText().toString()); 等于 textView 中的值。

    String keys=datas.getKey(); 这将为您提供密钥可以是 m1m2m3,具体取决于您从 textview 检索的文本。

    然后其他两个将从数据库中检索特定键下的nameclass

    【讨论】:

    • 老兄,我不能在 for 循环中使用 child() 方法
    • 你为什么不能使用它?我在这里使用 valueventlistener 也不是 childeventlistener (但关于方法child() 应该没关系)
    • 大声笑我想我需要眼镜。但是它就像我想要的那样工作,谢谢!
    【解决方案2】:

    试试这个: 创建一个名为 Medicine 的类(如果您还没有)并使其具有两个字符串变量 nameclass 并创建一个构造函数、getter 和 setter 方法,然后使用此方法:

    public String getClassOfMedicineById(String id){
        final String medicineClass = "";
        FirebaseDatabase.getInstance().getReference("medicine-handbook").child("Medicines")
                .child(id)
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Medicine medicine = dataSnapshot.getValue(Medicine.class);
                        medicineClass = medicine.get_class();
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
        return medicineClass;
    }
    

    然后这样称呼它: getClassOfMedicineById("m1"); 哦,不要调用你的类 getter 方法getClass()。我认为Object 类中有一个方法,所以它可能会干扰或其他什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多