簡體   English   中英

Android Firebase數據庫如何從子節點檢索所有數據

[英]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 /出售/項目並在我的列表視圖中傳遞數據

點擊這里查看我的firebase,謝謝

您正在使用以下內容創建參考:

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

然后添加一個ChildEventListener 這意味着onChildAdded中的DataSnapshot將首先使用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();
    }

問題是您無法將收到的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM