Подкаталог чтения Firebase в каждой записи - PullRequest
0 голосов
/ 01 октября 2018

Как я могу получить список всех элементов "Floor" в моей базе данных.Если я использую следующую базу данных, мой список должен иметь 3 элемента.Список должен содержать элементы с идентификаторами 1234, 4321, 2341.

 mydatabase
    -buildings
     --LNBxRoNBhVZyXniqe9t
      ---checked
      ---anzI
      ---anzA
      ---floors
       ----f1
        -----1234
         ------description
         ------id
       ----f2
        -----4321
         ------description
         ------id

     --LXdsafRfasdf12asdfJ
      ---checked
      ---anzI
      ---anzA
      ---floors
       ----f1
        -----2341
         ------description
         ------id

Это мой DAO:

     private FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("buildings");
    @Override
    public void initialize() {
        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        List<Floors> list = new LinkedList<>();

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                        ????
                       }

          @Override
          public void onCancelled(DatabaseError error) {
          Log.w(TAG, "Failed to read value.", error.toException());
           }});

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Как я могу получить список всех элементов "Floor" в моей базе данных?

Очень простым способом, повторяя базу данных, используя метод getChildren() три раза.

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference buildingsRef = rootRef.child("buildings");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
            for(DataSnapshot ds : dSnapshot.child("floors").getChildren()) {
                for(DataSnapshot d : ds.getChildren()) {
                    String key = d.getKey();
                    String description = d.child("description").getValue(String.class);
                    list.add(key);
                    Log.d("TAG", key);
                }
            }
        }

        //Do what you need to do with your list
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage());
    }
};
buildingsRef.addListenerForSingleValueEvent(valueEventListener);

Список должен содержать элементы с идентификаторами 1234, 4321, 2341

Список будет содержать три точных идентификатора.Если вы попытаетесь распечатать список в вашем logcat, результат будет:

[1234, 4321, 2341]
0 голосов
/ 01 октября 2018

Вам нужно будет пройти через DataSnapshot, который вы получаете от Firebase.Как то так

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot buildingSnapshot: dataSnapshot.getChildren()) {
      for (DataSnapshot floorSnapshot: buildingSnapshot.child("floors").getChildren()) {
        for (DataSnapshot numberSnapshot: floorSnapshot.getChildren()) {
          Log.i(TAG, numberSnapshot.getKey()); // "1234", "4321", "2341"
          Log.i(TAG, ""+numberSnapshot.child("id").getValue());
        }          
      }
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
    Log.w(TAG, "Failed to read value.", error.toException());
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...