Android Firebase数据库如何从子节点检索所有数据

时间:2018-09-27 16:27:12

标签: java android firebase firebase-realtime-database

我有一个应用程序,它可以从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 / Sold / Item并在listview中传递数据

Click this to see my firebase thank you

2 个答案:

答案 0 :(得分:0)

您要使用以下内容创建参考:

database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Sold").child("Item");

然后添加一个ChildEventListener。这意味着您的DataSnapshot中的onChildAdded将首先用DUMMY 1节点的快照调用,然后用DUMMY 2节点的快照调用。

您正在dataSnapshot.getValue(String.class)中呼叫onChildAdded。但是由于DUMMY 1DUMMY 2具有多个属性,因此它们没有单个字符串值。因此该调用会返回null,这可能是导致您出现问题的原因。

如果要将DUMMY 1DUMMY 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();
    }

答案 1 :(得分:0)

问题是您无法将接收到的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));
                    }
                }