【问题标题】:How to get child key-value pairs in Firebase when immediate parent is known?已知直接父级时如何在 Firebase 中获取子键值对?
【发布时间】:2020-12-29 11:11:08
【问题描述】:

我已经编写了以下代码来搜索特定节点,它确实可以正常工作。

private void SearchFirebase() {
    Rootref.orderByChild("IMG").equalTo(imUrl).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot product : snapshot.getChildren()){
                id = product.getKey(); //returns the id(for eg. 8006)
            }
        }

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

        }
    });
}

但是一旦知道特定父键,我不知道如何访问子键值对

在上图中,我需要获取 Product NameProduct Discount 等键值对。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    您只需将孩子添加到您的参考并获取数据,如answer中所述

    private void SearchFirebase() {
        Rootref.orderByChild("IMG").equalTo(imUrl).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot product : snapshot.getChildren()){
                    id = product.getKey();
                    Log.i(TAG, Rootref.child(id).child("Product Discount").getValue(String.class));
                }
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
    
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      查询 Firebase 实时数据库时,获取数据最方便的方法是直接从“DataSnapshot”对象调用正确的子对象并将其转换为正确的类型,如以下代码行所述:

      DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
      DatabaseReference productsRef = rootRef.child("Products");
      Query imgUrlQuery = productsRef.orderByChild("IMG").equalTo(imUrl);
      ValueEventListener valueEventListener = new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              for(DataSnapshot ds : dataSnapshot.getChildren()) {
                  String productDiscount = ds.child("Product Discount").getValue(String.class);
                  String productId = ds.child("Product Id").getValue(String.class);
                  String productName = ds.child("Product Name").getValue(String.class);
                  String productPrice = ds.child("Product Price").getValue(String.class);
                  String shopName = ds.child("Shop Name").getValue(String.class);
                  Log.d("TAG", productDiscount + "/" + productId + "/" + productName + "/" + productPrice + "/" + shopName);
              }
          }
      
          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {
              Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
          }
      };
      imgUrlQuery.addListenerForSingleValueEvent(valueEventListener);
      

      logcat 中的结果将是:

      0/8006/Frooti/50/shop-A
      

      【讨论】:

      • 但是如果我要全局使用字符串呢?这可能吗,因为字符串是不可变的吗?
      • 不,您不能将这些字符串用作全局变量,这是因为 Firebase API is asynchronous。是的,String 对象是不可变的,但它与异步编程无关。
      猜你喜欢
      • 2020-08-09
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2018-07-23
      • 2018-10-08
      相关资源
      最近更新 更多