Java 如何根据条件从firebase数据库中获取图像url并将其加载到ImageView中?
我对安卓系统还不熟悉,并且一直在关注以下问题- 在JSON中: { “-LwDpiyCDf8tsjTfTF3Q”:{ “productImage”:“, “产品名称”:“图像” }, “-LwDsEXofrJaz9SAjPi4”:{ “productImage”:“, “产品名称”:“mgj” } } 我的代码中有产品名称,我希望通过将产品名称作为WHERE条件传递来获取图像(在本例中为productImage),并最终将该图像加载到ImageView中 我尝试使用以下代码:Java 如何根据条件从firebase数据库中获取图像url并将其加载到ImageView中?,java,android,firebase,firebase-realtime-database,imageview,Java,Android,Firebase,Firebase Realtime Database,Imageview,我对安卓系统还不熟悉,并且一直在关注以下问题- 在JSON中: { “-LwDpiyCDf8tsjTfTF3Q”:{ “productImage”:“, “产品名称”:“图像” }, “-LwDsEXofrJaz9SAjPi4”:{ “productImage”:“, “产品名称”:“mgj” } } 我的代码中有产品名称,我希望通过将产品名称作为WHERE条件传递来获取图像(在本例中为productImage),并最终将该图像加载到ImageView中 我尝试使用以下代码: Query qu
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()方法中要写什么代码
请指导我。在数据更改中查询是正确的。您需要从数据库中检索值:
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
以获取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
对象。此对象应包含对象列表。即使只是一个结果,也需要迭代
1->首先获取所有产品并尝试以下代码2->比之后 您可以同时获得产品和产品形象 ==>如果要通过查询获取产品,则需要将密钥为的详细信息存储在仅具有产品和产品名称密钥的其他实体中
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
DatabaseReference allProducts=rootRef.child(“bmbuploads”);
addressRef.addListenerForSingleValueEvent(valueEventListener);
List listAllProduct=新列表
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Log.d(标记“总天数计数:”+dataSnapshot.getChildrenCount());
//dataSnapshot.getChildren()给出所有的日期,例如第1天、第2天//您可以在这里获得计数
对于(DataSnapshot ds:DataSnapshot.getChildren()){
String key=ds.getKey();//第1天获取密钥
//再添加一名观察员,为您提供天数匹配,例如
DatabaseReference childRef=rootRef.child(“bmbuploads”).child(key);//其中key=e.g第1天
//添加提供地址详细信息的新列表
childRef.addListenerForSingleValueEvent(productValueventListner);//此值事件列表器为您提供子匹配项
/**
*对于匹配项,添加dayvalueevent列表,该列表提供所有匹配项的计数。
**/
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记,databaseError.getMessage());//不要忽略错误!
}
};
//提供所有产品
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Log.d(标记“总天数计数:”+dataSnapshot.getChildrenCount());
//dataSnapshot.getChildren()给出所有的日期,例如第1天、第2天//您可以在这里获得计数
Products producs=dataSnapshot.getValue(Products.class);
listAllProduct.add(producs);//您可以在这里查看所有产品
Log.d(“allProducts”,listAllProduct.toString());
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记,databaseError.getMessage());//不要忽略错误!
}
};
公共静态类产品{
公众形象;
公共字符串产品名称;
公共字符串getProductImage(){
返回产品图像;
}
public void setProductImage(字符串productImage){
this.productImage=productImage;
}
公共字符串getProductName(){
返回产品名称;
}
公共无效setProductName(字符串productName){
this.productName=productName;
}
}
非常感谢,您的解决方案成功了!在获取存储在字符串变量中的图像URL后,如何将其设置为ImageView?使用glide库在OnDataChange中设置图像是的,它还可以为您的解决方案提供相同的功能!在获取存储在字符串变量中的图像URL后,如何将其设置为ImageView?有一个奇怪的id,如“-LwDsEXofrJaz9SAjPi4”。那么,它不算中间孩子吗?它没有,因为我们在整个对象中循环。如何将其设置为ImageView?只需在onDataChange中使用Glide库即可。在那之后,告诉我它是否有效。
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;
}
}