【问题标题】:How to fetch image url from firebase database based on condition and load it into an ImageView?如何根据条件从firebase数据库中获取图像url并将其加载到ImageView中?
【发布时间】:2023-03-17 21:18:01
【问题描述】:

我是 Android 新手,遇到以下问题-

My Firebase Database

在 JSON 中:

{ “-LwDpiyCDf8tsjTfTF3Q”:{ "productImage" : "https://firebasestorage.googleapis.com/v0/b/bookmybook-13560.appspot.com/o/bmbuploads%2F1576501910798.jpg?alt=media&token=a431aec5-0994-4acf-b597-e31b87775ac8", “产品名称”:“图像” }, “-LwDsEXofrJaz9SAjPi4”:{ "productImage" : "https://firebasestorage.googleapis.com/v0/b/bookmybook-13560.appspot.com/o/bmbuploads%2F1576502569064.jpg?alt=media&token=573bcfc0-d29e-4e8c-9076-af2868c1c7a5", “产品名称”:“mgj” } }

我的代码中有产品名称,我想通过将产品名称作为 WHERE 条件传递来获取图像(在本例中为 productImage),最后将该图像加载到 ImageView 中。

我尝试使用以下代码:

Query query = databaseReference.child("bmbuploads").orderByChild("productName").equalTo("image");
query.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

我不知道我形成的查询是否正确。另外,即使搜索了很多,我也无法弄清楚在 onDataChange() 方法中要写什么代码。

请指导我。

【问题讨论】:

    标签: java android firebase firebase-realtime-database imageview


    【解决方案1】:

    onDataChange 中的查询是正确的,您需要从数据库中检索值:

    Query query = databaseReference.child("bmbuploads").orderByChild("productName").equalTo("image");
    query.addValueEventListener(new ValueEventListener() {
    
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds :dataSnapshot.getChildren()) {
                  String productUrl = ds.child("productImage").getValue(String.class);
    
                }
             } 
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            });
    

    添加对节点 bmbuploads 的引用后,您需要进行迭代才能检索子节点 productImage

    【讨论】:

    • 非常感谢,您的解决方案有效!将该图像 URL 存储在字符串变量中后,如何将其设置为 ImageView?
    • stackoverflow.com/questions/45232608/…使用glide库在ondatachange里面设置图片
    • 是的,它也一样
    【解决方案2】:

    要获取productImage属性的值,请使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query query = rootRef.child("bmbuploads").orderByChild("productName").equalTo("image");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String productImage = ds.child("productImage").getValue(String.class);
                Log.d(TAG, productImage);
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    };
    query.addListenerForSingleValueEvent(valueEventListener);
    

    看,即使你想返回单个结果,你也必须使用getChildren() 方法循环遍历productImage 对象。该对象应包含对象列表。即使只有一个结果,你也需要迭代。

    【讨论】:

    • 非常感谢您的解决方案!将该图像 URL 存储在字符串变量中后,如何将其设置为 ImageView?
    • 有一个奇怪的 id,比如“-LwDsEXofrJaz9SAjPi4”。那么,它不是算作中间子对象吗? 因为我们正在循环整个对象,所以不算。 如何将其设置为 ImageView? 只需在 onDataChange 中使用 Glide 库,如 here 所述。之后,告诉我它是否有效。
    【解决方案3】:

    1 -> 获取所有产品首先尝试下面的代码
    2 -> 比之后 您可以获得产品和产品图片

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference allProducts = rootRef.child("bmbuploads");
    addressRef.addListenerForSingleValueEvent(valueEventListener);
    List<Products> listAllProduct = new List<Products>
    
    
    
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             Log.d(TAG, "total days count: " + dataSnapshot.getChildrenCount());
            // dataSnapshot.getChildren()  give all the days e.g day 1,day 2  // you can get your count here
              for(DataSnapshot ds : dataSnapshot.getChildren()) {
                   String key = ds.getKey();  // get key as day 1 
    
                // add one more observer that give you days matches e.g  
                DatabaseReference childRef = rootRef.child("bmbuploads").child(key);  //where key = e.g day 1                  
                // add new listent that give you detail of address 
                childRef.addListenerForSingleValueEvent(productValueventListner);   // This value event lister give you child matches  
    
                /**
                * For matches add dayvalueevent listent that give you all matches count.
                **/
    
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    };
    
    
    
    // give all products
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             Log.d(TAG, "total days count: " + dataSnapshot.getChildrenCount());
            // dataSnapshot.getChildren()  give all the days e.g day 1,day 2  // you can get your count here
               Products producs = dataSnapshot.getValue(Products.class);
               listAllProduct.add(producs);  // you go all product here
               Log.d("allProducts",listAllProduct.toString());
    
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    };
    
    
    public static class Products {
    
      public String productImage;
      public String productName;
    
    
        public String getProductImage() {
            return productImage;
        }
    
        public void setProductImage(String productImage) {
            this.productImage = productImage;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-25
      • 2017-10-26
      • 1970-01-01
      • 2022-01-25
      • 2020-08-19
      • 2017-11-03
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多