Как мне получить список всех элементов «Этаж» в моей базе данных. Если я использую следующую базу данных, в моем списке должно быть 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
This is my 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());
}});




Вам нужно будет пройти через 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());
}
});
@AlexMamo: спасибо за редактирование, но я намеренно оставил String.class выключенным, так как вопрос не показывает тип данных для свойства id.
Будучи идентификатором, я предполагал, что свойство имеет тип String, но вы правы, это может быть объект любого типа. Прости за это.
Первоначально у меня был String.class, но затем я заметил, что все ключи в вопросе были числовыми (конечно, сохраненными как String, потому что ключи по определению являются строками).
Если бы свойство id было типа number, конкатенация работает отлично, тогда как передача String.class методу getValue() вызовет исключение, подобное этому: Failed to convert value of type java.lang.Long to String. Спасибо!
How can I get a list of all "Floor" elements in my Database?
Очень просто, трижды повторяя базу данных с помощью метода 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);
List should contain the elements with the id's 1234, 4321, 2341
Список будет содержать именно эти три идентификатора. Если вы попытаетесь распечатать список в своем журнале регистрации, результат будет следующим:
[1234, 4321, 2341]
если мне нужно значение описания, я просто делаю d.child ("description"). getValue () или?
Чтобы получить description, см. Мой обновленный ответ.
Пожалуйста! Если вы считаете, что мой ответ вам помог, примите его, нажав на галочку (✔️) слева под стрелками голосования. Должен поменять цвет на зеленый. Я бы оценил это. Спасибо!
у вас есть решение @khaled_bhar?