2017-02-27 154 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名称。更改要么使其工作。 –

相关问题