2017-02-27 183 views
1

我是新來的。我無法從Firebase數據庫檢索數據。我想檢索每個類別的名稱和food_items如何從Android中的Firebase實時數據庫檢索數據?

MYDATABASE

{ 
    "categories" : { 
     "category1" : { 
      "name" : "Babyfood" 
     }, 
     "category2" : { 
      "name" : "Dairy" 
     }, 
     "category3" : { 
      "food_items" : { 
      "item1" : true, 
      "item2" : true 
      }, 
      "name" : "Fruits" 
     } 
     }, 
     "food_items" : { 
     "item1" : { 
      "category" : "category3", 
      "name" : "Apple" 
     }, 
     "item2" : { 
      "category" : "category3", 
      "name" : "Banana" 
     } 
    } 
} 

FoodCategory.java

public class FoodCategory implements Serializable{ 

    String name; 
    FoodItem food_items; 

    public FoodCategory(){} 

    public FoodCategory(String name, FoodItem food_items) { 
     this.name = name; 
     this.food_items = food_items; 
    } 

    public FoodItem getFoodItems() { 
     return food_items; 
    } 

    public String getName() { 
     return name; 
    } 

    public FoodCategory(FoodCategory category){ 
     this.name = category.getName(); 
     this.food_items = category.getFoodItems(); 
    } 

} 

FoodItem.java

public class FoodItem { 
    String name; 

    public FoodItem(FoodItem foodItem) { 
     this.name = foodItem.getName(); 
    } 

    public String getName() { 
     return name; 
    } 
} 

這裏是我的用於檢索每個類別的數據代碼

mRootRef = FirebaseDatabase.getInstance().getReference(); 
    mCategoryRef = mRootRef.child("categories"); 
    mCategoryRef.addValueEventListener(new ValueEventListener() { 

     ArrayList<FoodCategory> values = new ArrayList<>(); 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot snapshot: dataSnapshot.getChildren()){ 
       FoodCategory c = snapshot.getValue(FoodCategory.class); 
       Log.d("Categories: ", c.name + " " + c.food_items); 
       values.add(c); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

它返回類別的姓名權價值,但空值food_items

回答

0

在你FoodCategory模型中,你提到它只有FoodItem

public class FoodCategory implements Serializable{ 
    String name; 
    FoodItem food_items; 
    ... 
} 

而且通過看你的數據庫結構,它應該是一個列表/數組FoodItem對不對?如果你的FoodItem只包含名稱字符串鍵和布爾值true作爲值(它總是真的吧?),那麼也許你應該讓HashMap,這樣

public class FoodCategory implements Serializable{ 
    String name; 
    HashMap<String, Boolean> food_items; 
    ... 
} 

這樣,你不需要FoodItem自定義對象。 (或者你仍然可以使用,使FoodItem自定義對象的food_items列表/陣列。

編輯

看起來像原始的海報神奇地「知道」做什麼,並回答它自己(啊?)。但是,對於那些誰都有同樣的問題,在這裏尋找答案,這個解釋是爲你

數據庫結構:

{ 
    "categories" : { 
     "category1" : { 
      "name" : "Babyfood" 
     }, 
     "category2" : { 
      "name" : "Dairy" 
     }, 
     "category3" : { 
      "food_items" : { 
      "item1" : true, 
      "item2" : true 
      }, 
      "name" : "Fruits" 
     } 
     }, 
     "food_items" : { 
     "item1" : { 
      "category" : "category3", 
      "name" : "Apple" 
     }, 
     "item2" : { 
      "category" : "category3", 
      "name" : "Banana" 
     } 
    } 
} 

在代碼SA在發佈的問題中,它讀取categories上的值並搜索categories/???/food_items作爲值。請注意,food_items我在這裏提到的是categories而不是food_items父母的item1item2

所以當然它會包含第一個和第三個孩子的null,因爲它實際上沒有價值。但是,第二個將有2個值:

{ "item1":true, "item2":true } 

注意:它有兩個值,所以我建議使用HashMap讀它,因爲原來的海報它讀成單個值。

從那裏,我們知道什麼是錯的。之後,您可能想要獲取item1item2的詳細信息,因爲它只包含布爾值(它就像是sql中的外鍵)。那麼你應該讀取價值food_items/???,你去了。

+0

每個類別包含類別的名稱和食品項目列表。例如,類別3包含「水果」作爲類別的名稱,並且食品項目列表是{蘋果,香蕉}(即Item1,來自food_items的項目2)。 food_categories的foodItems是FoodItems對象。我使用** HashMap food_items **但是,我仍然將food_items設置爲null。 – user2970035

+0

感謝您的解釋。這很有幫助。你能告訴我如何訪問像category1嵌套鍵(它可以是任何隨機鍵),我不知道,爲什麼我的構造函數沒有使用此代碼** snapshot.getValue(FoodCategory.class)**實例化。我必須用新操作員初始化它。 – user2970035

+0

你必須知道你想得到什麼密鑰,即使它是隨機的。然後像這樣做'mRootRef.child(「categories/category1」)''。看看[本文檔](http://stackoverflow.com/documentation/firebase-database/9​​242/reading-data/28681/understanding-which-data-referenced-by-getreference#t=201702282214462701557) – koceeng

0

要迭代節點的所有子節點,請改用ChildEventListener。 不要被方法名稱'onChildAdded'混淆,它會在第一次搜索所有條目。

mCategoryRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      FoodCategory c = dataSnapshot.getValue(FoodCategory.class); 
      Log.d("Categories: ", c.name + " " + c.food_items); 
      values.add(c); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

來源:https://firebase.google.com/docs/database/android/lists-of-data

+0

food_items仍爲null。 – user2970035

+0

您的數據模型是不同的。類別3中的food_item有布爾數組,但在您的FoodItem模型中定義了String名稱。更改要麼使其工作。 –

相關問題