Мне нужно получить доступ к определенному дочернему элементу из узла, у меня есть только «доступный ключ» конкретного дочернего элемента, а не полный путь.
Пожалуйста, взгляните на: firebase.google.com/docs/database/admin/retrieve-data
Вы включили изображение дерева JSON в свой вопрос. Пожалуйста, замените это фактическим JSON в виде текста, который вы можете легко получить, щелкнув ссылку «Экспорт JSON» в дополнительном меню (⠇) ваша консоль базы данных Firebase. Наличие JSON в виде текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь.
попробуй это :-
DatabaseReference mUserNameReference = FirebaseDatabase.getInstance().getReference("School").child("id").child("id");
mUserNameReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String email = dataSnapshot.child("email").getValue().toString());
//get all the key value like this
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
измените оба дочерних идентификатора в соответствии с вашими идентификаторами
у меня есть только второй идентификатор, но не первый
тогда вам нужно получить первый идентификатор, прежде чем получить значения
сначала просто добавьте жесткий код и установите оба идентификатора и попробуйте, работает ли он
Просто добавьте этот код:
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("school").child(firebaseUser.getUid();
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String email = dataSnapshot.child("Email").getValue().toString();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Если у вас есть ключ для этого дочернего элемента, но не полный путь, сначала получите ключ родительского узла в списке, как показано ниже.
Arraylist<String> keyList =new Arraylist();
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("school").child(firebaseUser.getUid();
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
String key = childSnapshot.getKey();
String value= childSnapshot.getValue(String.class);
keyList.add(key);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
теперь используйте цикл for или цикл foreach, чтобы проверить, содержит ли этот узел доступный дочерний ключ.
for(String key:keyList){
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("school").child(key).orderByChild("id").equal(availableKey);
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
String key = childSnapshot.getKey();
Object object= childSnapshot.getValue(Object.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Надеюсь, что это поможет вам..
Поскольку вы знаете ключ ребенка, которого ищете, вы можете запросить его:
DatabaseReference schoolsRef = FirebaseDatabase.getInstance().getReference().child("School");
Query query = schoolsRef.orderByKey().equalTo("MZ3bW5kLJAQorgnZbYiTaOoWWSG2");
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
String email = userSnapshot.child("email").getValue(String.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
Обратите внимание, что вы не можете использовать orderByChild("id"), как объяснено в моем ответе.
здесь: Двойной вложенный запрос Firebase.
Спасибо, братан, за предложение, "dataSnapshot.getValue().toString()" совершенно пуст.
Да, там у нас есть несколько ошибок. Поскольку это запрос, вам нужен цикл по снимку.
Спасибо, братан, я могу сделать это с помощью циклов, но я ищу способ сделать это без циклов.
Нет. Поскольку вы не знаете родительский ключ, вам необходимо выполнить запрос. И результаты запроса могут (на уровне API) всегда содержать несколько дочерних элементов, поэтому вам нужно перебрать их.
Также обратите внимание, что вы никогда не упоминали эту цель в своем первоначальном вопросе. Попробуйте привести лучший пример того, чего вы пытаетесь достичь, что вы уже пробовали и почему это не соответствует вашим потребностям.
извините за неудобства и спасибо за отличное объяснение.
что ты уже испробовал?