Android: Firebase Search Query не работает должным образом - PullRequest
0 голосов
/ 12 января 2019

Я довольно новичок в разработке приложений для Android. Я создал простой поисковый запрос, который выполняет поиск в моей базе данных Firebase по имени (см. Код ниже):

private void firebaseEventSearch(String name) {
    //query to search database based on text in textbox - made case insensitive
    Query eventSearchQuery = eventRef.orderByChild("name").startAt(name.toUpperCase()).endAt(name.toLowerCase() + "\uf8ff");
    eventSearchQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                Event event = eventSnapshot.getValue(Event.class);
                events.add(event);
            }
            adapter.notifyDataSetChanged();
        }

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

        }
    });
}

По большей части работает нормально, однако отображает все результаты базы данных, когда я набираю буквы "A" или "B" - поиск не работает для этих двух букв. Кроме того, если я введу строку поиска, где первая буква соответствует записи базы данных, он отобразит этот элемент базы данных, даже если остальная строка не соответствует ему.

Буду очень признателен, если кто-нибудь поможет мне понять, почему этот поисковый запрос не работает должным образом.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Запросы к базе данных Firebase чувствительны к регистру. Поэтому, когда вы вызываете orderByChild("name"), все узлы упорядочены по их свойству name. Если вы посмотрите на диаграмму ASCII, вы увидите, что это приведет к следующему порядку для строчных и прописных символов:

A B C .... X Y Z a b c ... x y z

Теперь ваш запрос принимает часть этих данных. Если вы ищете A, срез будет:

A B C .... X Y Z a

Так что это намного больше, чем вы хотите.

Если вы хотите разрешить поиск без учета регистра в Firebase, наиболее распространенный (но не полностью отказоустойчивый) способ его реализации заключается в добавлении дополнительного свойства, которое сохраняет имя без учета регистра. Например. "name_uppercase": "ZUHRAIN". С этим вы можете искать:

eventRef.orderByChild("name_uppercase").startAt(name.toUpperCase()).endAt(name.toUpperCase() + "\uf8ff");

Также см .:

0 голосов
/ 12 января 2019

Запрос в Firebase действительно чувствителен к заглавной букве. Попробуйте это.

private void firebaseEventSearch(String name) {
    //query to search database based on text in textbox - made case insensitive
    //Add this part
    String firstLetterCapital = query.substring(0, 1).toUpperCase() + query.substring(1);
    Query eventSearchQuery = eventRef.orderByChild("name").startAt(firstLetterCapital).endAt(firstLetterCapital + "\uf8ff");
    eventSearchQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                Event event = eventSnapshot.getValue(Event.class);
                events.add(event);
            }
            adapter.notifyDataSetChanged();
        }

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

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