有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据条件从firebase数据库获取图像url并将其加载到ImageView中?

我对安卓系统还不熟悉,并且一直在关注以下问题-

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", "productName" : "image" }, "-LwDsEXofrJaz9SAjPi4" : { "productImage" : "https://firebasestorage.googleapis.com/v0/b/bookmybook-13560.appspot.com/o/bmbuploads%2F1576502569064.jpg?alt=media&token=573bcfc0-d29e-4e8c-9076-af2868c1c7a5", "productName" : "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()方法中要写什么代码

请在这方面指导我


共 (3) 个答案

  1. # 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

  2. # 2 楼答案

    1 -> get all product first try below code for that
    2 -> than after you get both product and product image

    ==> if want to get product by query you need to store details with key in some other entity that have key of product and productname only.

    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;
        }
    
    }
    
  3. # 3 楼答案

    要获取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对象。此对象应包含对象列表。即使只有一个结果,也需要迭代