2017-02-27 21 views
1

ここは新しいですね。 Firebaseデータベースからデータを取得できません。私は各カテゴリの名前とfood_itemsを取得したいです。AndroidでFirebaseリアルタイムデータベースからデータを取り出す方法は?

{ 
    "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; 
    } 
} 

がある

をMYDATABASE私各カテゴリ

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の場合はnull。

答えて

0

FoodItemのリスト/配列が正しいですか?そして、あなたのFoodItemのみ(その常に真、右?)の値として真の鍵とブール値として名前文字列が含まれている場合は、その後、多分あなたは、この

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

その方法のように、あなたがFoodItemを必要としない、それHashMap行う必要がありますカスタムオブジェクト。 (またはあなたはまだそれを使用してFoodItemカスタムオブジェクトのfood_itemsリスト/配列を作ることができます。

は魔法の元のポスターのように見える

EDIT「知っている」何をすると(でしょ?)それを自分自身に答えます。しかし、同じ問題を抱えているし、ここで答えを探している人のために、この説明はあなたのためです

データベース構造:。

{ 
    "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です。

もちろん、それは実際には値を持たないので、最初と3番目の子にはnullが含まれます。それは2つの値を持っているので、私は、元のポスターは単一の値としてそれを読んでいるので、それを読むためにHashMapを使用することをお勧めします

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

注:しかし、もう一つは2つの値を持つことになります。

そこから、われわれは何が間違っているのかを知っている。その後、item1item2の詳細を取得するには、ブール値しか含まれていない可能性があります(sqlの外部キーのようなものです)。次に値food_items/???を読み、そこに行くべきです。

+0

各カテゴリには、カテゴリの名前と食品のリストが含まれています。例えば、category3はカテゴリの名前として「Fruits」を含み、食品アイテムのリストは{Apple、banana}(すなわちfood1アイテムのItem1、Item2)である。 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) { 

     } 
    }); 

出典:

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

そして、あなたのデータベースの構造を見ることで、それはする必要があります:あなたはそれがFoodItemの唯一SINGLE値を持っていることを言及ごFoodCategoryモデルでhttps://firebase.google.com/docs/database/android/lists-of-data

+0

food_itemsはまだnullです。 – user2970035

+0

データモデルが異なります。カテゴリ3のfood_itemにはブール値の配列がありますが、FoodItemモデルではString nameを定義しました。いずれかを変更して動作させる。 –

関連する問題