![](/img/trans.png)
[英]How to retrieve all the data from a node in Android Firebase realtime database?
[英]android firebase database how to retrieve all data from child node
我有一个应用程序,它可以从Firebase检索大量数据,但是我似乎无法使其工作。
database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Sold").child("Item");
myListView = (ListView)findViewById(R.id.listView);
final ArrayAdapter<String> myArrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myArrayList);
myListView.setAdapter(myArrayAdapter);
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String value = dataSnapshot.getValue(String.class);
myArrayList.add(value);
myArrayAdapter.notifyDataSetChanged();
}
它不会给我任何错误,但是会关闭我的应用程序。 我试图访问URL /出售/项目并在我的列表视图中传递数据
您正在使用以下内容创建参考:
database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Sold").child("Item");
然后添加一个ChildEventListener
。 这意味着onChildAdded
中的DataSnapshot
将首先使用DUMMY 1
节点的快照调用,然后使用DUMMY 2
节点的快照调用。
你打电话dataSnapshot.getValue(String.class)
在onChildAdded
。 但是,由于DUMMY 1
和DUMMY 2
具有多个属性,因此它们没有单个字符串值。 因此该调用返回null
,这可能是导致您出现问题的原因。
如果要将DUMMY 1
和DUMMY 2
键本身添加到适配器,则可以调用dataSnapshot.getKey()
。 否则,您可以使用dataSnapshot.child("Description").getValue(String.class)
获得特定子属性的值。
所以:
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String key = dataSnapshot.getKey();
String description = dataSnapshot.child("Description").getValue(String.class);
Long quantity = dataSnapshot.child("Quantity").getValue(Long.class);
myArrayList.add(key+": "+description+" ("+quantity+")");
myArrayAdapter.notifyDataSetChanged();
}
如果您想将整个值读入表示项目的类(所谓的POJO),则最简单的类是:
public class Item {
public String Description;
public Long Quantity;
}
请注意,字段名称(包括大小写)必须与数据库中属性的名称完全匹配。 您可以像这样使用上面的类:
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String key = dataSnapshot.getKey();
Item item = dataSnapshot.getValue(Item.class);
myArrayList.add(key+": "+item.description+" ("+item.quantity+")");
myArrayAdapter.notifyDataSetChanged();
}
问题是您无法将收到的dataSnapshot转换为String。
因此,这样做是更好的选择:
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
for (DataSnapshot dummys : dataSnapshot.getChildren()) {
String description = dummys.child("Description").getValue(String.class);
int Quantity = dummys.child("Quantity").getValue(Integer.class);
//Use your variables here
}
}
或者,如果您要创建虚拟对象:
public class Dummy {
String Description;
Integer Quantity;
public Dummy(String description, Integer quantity) {
Description = description;
Quantity = quantity;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public Integer getQuantity() {
return Quantity;
}
public void setQuantity(Integer quantity) {
Quantity = quantity;
}
}
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
List<Dummy> dummyList = new ArrayList<>();
for (DataSnapshot dummys : dataSnapshot.getChildren()) {
dummyList.add(dummys.getValue(Dummy.class));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.