Firebase Search - поиск вложенных объектов в Firebase Android - PullRequest
0 голосов
/ 22 марта 2019

Я хочу выполнить поиск по строковому значению дочернего элемента "title" из всех дочерних элементов "category":

снимок базы данных

Я добавил правила базы данныхкак это:

снимок правил базы данных

Я пытался с этим кодом:

public void getData(String search_key) {
    dbref.child("data").orderByChild("title").startAt(search_key).endAt(search_key + "\uf8ff").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String title = null;
            for (DataSnapshot data:dataSnapshot.getChildren()) {
                for (DataSnapshot dataCategory:data.getChildren()) {
                    try {
                        Object object = dataCategory.child(DBConstants.CHILD_TITLE).getValue();
                        if (object != null) title = object.toString();
                    } catch (NullPointerException e) {
                        //comments
                    }
                    System.out.println(title);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

1 Ответ

0 голосов
/ 22 марта 2019

Невозможно добиться этого, используя структуру базы данных, поскольку между вашим узлом data и объектами, содержащими свойство title, существует еще один дочерний элемент, Category.

.

Вы можете использовать следующий запрос:

dbref.child("data").child("Category1")
    .orderByChild("title")
    .startAt(search_key)
    .endAt(search_key + "\uf8ff")
    .addListenerForSingleValueEvent(/* ... */);

И цикл только один раз , а не вдвое больше, чем вы делаете в своем коде прямо сейчас, но вы сможете получить только заголовки, которые существуют в узле Category1. Если вы хотите получить все заголовки, вам следует реструктурировать базу данных, указав категорию в качестве свойства ваших объектов, а затем просто использовать:

dbref.child("data") //No Category1 child
    .orderByChild("title")
    .startAt(search_key)
    .endAt(search_key + "\uf8ff")
    .addListenerForSingleValueEvent(/* ... */);

Таким образом, у вас будет меньше уровень, и этот запрос будет отлично работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...