2017-02-27 3 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

, 당신이 FoodItemSINGLE 값이 언급 :

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

을 그리고 당신의 데이터베이스 구조를 보면, 그것이 있어야 FoodItem의 목록/배열이 맞습니까? 당신의 FoodItem는 값으로 키와 진정한 부울 이름 문자열을 포함하는 경우 그리고 (그는 항상 true, 그렇지?) 어쩌면 당신은 FoodItem 필요하지 않습니다,이

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

그 방법처럼, 그것을 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" 
     } 
    } 
} 

코드 사에서 질문에 게시 된 답변은 categories의 값을 읽고 값은 categories/???/food_items으로 검색하십시오. 여기에서 언급 한 food_itemscategories이 아니고 food_items 부모가 item1이고 item2 인 것을 언급합니다.

물론 첫 번째 및 세 번째 자식에 대해서는 null이 포함되어 있으므로 실제로는 값이 없습니다.이 두 값을 가지고, 그래서 나는 원래 포스터가 하나의 값으로 읽기 때문에, 읽어 HashMap를 사용하는 것이 좋습니다 :

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

참고 :하지만 두 번째는이 개 값을 가질 것이다.

거기에서 우리는 무엇이 잘못되었는지 압니다. 그 다음에는 item1item2의 세부 정보를 얻고 자 할 것입니다 (부울은 SQL에 외래 키와 같습니다). 그런 다음 값 food_items/???을 읽어야합니다.

+0

각 카테고리는 카테고리의 이름과 음식 목록을 포함합니다. 예를 들어 카테고리 3은 카테고리 이름으로 '과일'을 포함하고 음식 항목 목록은 {Apple, banana}입니다 (예 : food_items의 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/9242/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-dataFoodCategory 모델에서

+0

food_items 여전히 null입니다. – user2970035

+0

데이터 모델이 다릅니다. 카테고리 3의 food_item에는 불린 배열이 있지만 FoodItem 모델에는 문자열 이름을 정의했습니다. 둘 중 하나를 변경하여 작동되게하십시오. –

관련 문제