Google Firebase проверить, если ребенок существует
В моем приложении мне нужно проверить, есть ли у данного элемента моей базы данных на firebase дочерний элемент с заданным именем. Я надеялся, что это можно сделать, используя что-то вроде:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
if (rootRef.childExists("name")) {
//run some code
}
Я искал, но не мог найти ничего полезного.
2 ответа
Редактировать 2; Стоит поставить на первое место: я думаю, что стоит упомянуть, что это на самом деле загрузка всех данных на этом снимке, просто чтобы проверить, существуют ли какие-либо данные. Вы должны быть внимательны здесь. Если ссылка огромна (например, на самом деле это корневая ссылка, а не конкретный дочерний элемент / свойство), вам следует либо найти более глубокий узел, который можно использовать для проверки существования, либо по-разному спроектировать структуру данных, чтобы была возможна эффективная проверка.
Ссылка на базу данных - это фактически 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
,
редактировать: я изначально использовал неправильное имя функции (childExists вместо hasChild)
Не делай так
НИКОГДА
Он заберет все ваши данные и доставит на устройство
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
}
}
});
Полное решение. Нет необходимости скачивать все данные. Просто проверьте, существует ли ребенок вот так:
// Assuming the names are in the name node. Remove "name/" if not
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("name/" + name);
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// Exist! Do whatever.
} else {
// Don't exist! Do something.
}
}
@Override
public void onCancelled(DatabaseError error) {
// Failed, how to handle?
}
});
Попробуйте использовать .childexists
в комбинации с .equalTo("Your specific name")
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) {
}
});
Используйте snapshot.exists(), чтобы проверить, содержит ли указанная запись базы данных дочерний элемент, независимо от значения дочернего элемента.