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(), чтобы проверить, содержит ли указанная запись базы данных дочерний элемент, независимо от значения дочернего элемента.

Другие вопросы по тегам