Google firebase проверяет, существует ли дочерний элемент
В моем приложении мне нужно проверить, есть ли у данного элемента моей базы данных в firebase дочерний элемент с заданным именем. Я надеялся, что это можно будет сделать, используя что-то вроде:
if (rootRef.childExists("name")) { //run some code }
Я искал, но не смог найти ничего полезного.
Переведено автоматически
Ответ 1
Правка 2; стоит добавить сверху: я думаю, стоит упомянуть, что фактически выполняется загрузка всех данных с этого снимка, просто чтобы проверить, существуют ли какие-либо данные. Здесь вы должны быть внимательны. Если ссылка огромна (например, фактически корневая ссылка, а не конкретный дочерний элемент / свойство), то вам следует либо найти более глубокий узел, который вы можете использовать для проверки существования, либо спроектировать структуру данных по-другому, чтобы была возможна эффективная проверка.
Ссылка на базу данных фактически является URL-адресом для этих данных. Вы хотите на самом деле получить данные, чтобы увидеть, существует ли дочерний элемент. Вот почему метод, который вы, похоже, ищете, находится в DataSnapshot.
DatabaseReferencerootRef= FirebaseDatabase.getInstance().getReference(); rootRef.addListenerForSingleValueEvent(newValueEventListener() { @Override voidonDataChange(DataSnapshot snapshot) { if (snapshot.hasChild("name")) { // run some code } } });
Теперь этот шаблон проектирования кажется немного странным. Вы читаете всю базу данных просто для того, чтобы посмотреть, существует ли "name". Вы можете сделать это немного эффективнее, прослушав rootRef.child("name"), а затем просто проверив, существует ли snapshot.exists().
Если вы пытаетесь выполнить валидацию здесь, а не управлять потоком, вам следует подумать о том, чтобы поместить этот код в свой rules.json.
редактировать: изначально я использовал неправильное имя функции (childExists вместо hasChild)
Ответ 2
Не делайте так
НИКОГДА
Он возьмет все ваши данные и перенесет на устройство
DatabaseReferencerootRef= FirebaseDatabase.getInstance().getReference(); rootRef.addListenerForSingleValueEvent(newValueEventListener() { @Override voidonDataChange(DataSnapshot snapshot) { if (snapshot.hasChild("name")) { // run some code } } });
Проверьте это следующим образом. Он вернет значение дочернего элемента, если он существует, в противном случае -> null
Комплексное решение. Нет необходимости загружать все данные. Просто проверьте, существует ли дочерний элемент следующим образом:
// Assuming the names are in the name node. Remove "name/" if not DatabaseReferencerootRef= FirebaseDatabase.getInstance().getReference("name/" + name); rootRef.addListenerForSingleValueEvent(newValueEventListener() {
@Override publicvoidonDataChange(DataSnapshot snapshot) { if (snapshot.exists()) { // Exist! Do whatever.
} else { // Don't exist! Do something.
} }
@Override publicvoidonCancelled(DatabaseError error) { // Failed, how to handle?
}
});
Ответ 4
Попробуйте использовать .childexists в сочетании с .equalTo("Your specific name")