Google firebase проверяет, существует ли ребенок
В моем приложении мне нужно проверить, есть ли у данного элемента моей базы данных на firebase дочерний элемент с заданным именем. Я надеялся, что это можно сделать, используя что-то вроде:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
if (rootRef.childExists("name")) {
//run some code
}
Я искал, но не мог найти ничего полезного.
Ответы
Ответ 1
Изменить 2; стоит поставить сверху: Я думаю, стоит упомянуть, что на самом деле это загрузка всех данных в этот снимок, чтобы проверить, существуют ли какие-либо данные. Вы должны помнить здесь. Если ссылка огромна (например, на самом деле корневая ссылка, а не конкретный тип child/property), вам следует либо найти более глубокий node, который вы можете использовать для проверки наличия или проектирования своей структуры данных по-разному, чтобы была эффективная проверка.
Ссылка на базу данных фактически является URL-адресом для этих данных. Вы хотите получить данные, чтобы узнать, существует ли ребенок. Вот почему метод, который вы, похоже, ищете, находится на DataSnapshot.
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.hasChild("name")) {
// run some code
}
}
});
Теперь этот дизайн выглядит немного странным. Вы читаете всю базу данных, чтобы узнать, существует ли "имя". Вы можете сделать это немного более эффективным, слушая rootRef.child("name")
, а затем просто проверяя, есть ли snapshot.exists()
.
Если вы пытаетесь сделать валидацию здесь, а не управлять потоком, вы должны рассмотреть возможность размещения этого кода в rules.json
.
edit: я изначально использовал неправильное имя функции (childExists вместо hasChild)
Ответ 2
Попробуйте использовать .childexists
в сочетании с .equalTo("Your specific name")
Ответ 3
UsersRef = FirebaseDatabase.getInstance().getReference();
Users.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.hasChild("childName")) {
// it exists!
}else{
// does not exist
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Ответ 4
Не делай так
НИКОГДА
Он заберет все ваши данные и доставит на устройство
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.hasChild("name")) {
// run some code
}
}
});
Проверьте это таким образом. Он вернет значение потомка, если существует, иначе → нуль
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("childName")
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.getValue() == null) {
// The child doesn't exist
}
}
});
Ответ 5
Используйте snapshot.exists(), чтобы проверить, содержит ли указанная запись базы данных дочерний элемент, независимо от значения дочернего элемента.