Реализовать функциональность поиска с помощью Cloud Firestore и Android Studio

#android #google-cloud-firestore #full-text-search #firebaseui

#Android #google-cloud-firestore #полнотекстовый поиск #firebaseui

Вопрос:

Я нахожусь в процессе реализации поиска элементов в recyclerview. Я использую Android studio и Cloud Firestore. При поиске статьи я получаю следующую ошибку:

Вызвано: исключение io.grpc.StatusException: INVALID_ARGUMENT: предложение Order by не может содержать поле с фильтром равенства

Как я могу не выполнить orderBy on "ville" ? Я не понимаю

Я хотел бы иметь возможность действовать таким образом для достижения результата. Что я действительно ищу, так это то, что список уже фильтруется по вводу первого символа. Спасибо

Мое поле поиска на самом деле представляет собой EditText.

 searchBox.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            Query query = db.collection("RESTO_TABLE").orderBy("ville",Query.Direction.ASCENDING)
                    .whereGreaterThan("ville",s)
                    .whereLessThan("ville",s "uf8ff");
            FirestoreRecyclerOptions<RestoModel> Options = new FirestoreRecyclerOptions.Builder<RestoModel>()
                    .setQuery(query,RestoModel.class)
                    .build();
            villeAdapter = new VilleAdapter(Options);
            villeAdapter.startListening();
            recyclerView.setAdapter(villeAdapter);
            }

            @Override
            public void afterTextChanged(Editable s) {
            Query query = db.collection("RESTO_TABLE").orderBy("ville",Query.Direction.ASCENDING)
                    .whereGreaterThan("ville",s)
                    .whereLessThan("ville",s "uf8ff");
            FirestoreRecyclerOptions<RestoModel> Options = new FirestoreRecyclerOptions.Builder<RestoModel>()
                    .setQuery(query,RestoModel.class)
                    .build();
            villeAdapter = new VilleAdapter(Options);
            villeAdapter.startListening();
            recyclerView.setAdapter(villeAdapter);

            }
        });
  

Трассировка в куче :

FirestoreRecycler: onError com.google.firebase.firestore.Исключение FirebaseFirestoreException: INVALID_ARGUMENT: предложение Order by не может содержать поле с фильтром равенства, размещенным на com.google.firebase.firestore.util.Util.exceptionFromStatus(Util.java:117) на com.google.firebase.firestore.core.EventManager.onError(EventManager.java: 166) на com.google.firebase.firestore.core.SyncEngine.removeAndCleanupTarget(SyncEngine.java:534) на com.google.firebase.firestore.core.SyncEngine.handleRejectedListen(SyncEngine.java:418) на com.google.firebase.firestore.core.MemoryComponentProvider$RemoteStoreCallback.handleRejectedListen(MemoryComponentProvider.java:99) в com.google.firebase.firestore.remote.Ошибка удаленного хранилища.processTargetError(RemoteStore.java:562) на com.google.firebase.firestore.remote.RemoteStore.handleWatchChange(RemoteStore.java: 446) на com.google.firebase.firestore.remote.RemoteStore.access за 100 долларов США (RemoteStore.java:53) на com.google.firebase.firestore.remote.Удаленный магазин $ 1.onWatchChange(RemoteStore.java: 176) на com.google.firebase.firestore.remote.WatchStream.onNext(WatchStream.java: 108) на com.google.firebase.firestore.remote.WatchStream.onNext(WatchStream.java:38) на com.Google.firebase.firestore.remote.AbstractStream $StreamObserver.lambda$onNext $1(AbstractStream.java:119) на com.google.firebase.firestore.remote.AbstractStream $StreamObserver $$ Lambda $ 2.запустите (неизвестный источник: 4) на com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(AbstractStream.java:67) на com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onNext(AbstractStream.java:110) на com.google.firebase.firestore.remote.FirestoreChannel $ 1.onMessage(FirestoreChannel.java:125) в io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:658) в io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:643) в io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) в io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) в java.util.concurrent.Исполнители $RunnableAdapter.call(Executors.java:457) в java.util.concurrent.FutureTask.run(FutureTask.java:266) в java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) на java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1162) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) на com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:229) на java.lang.Thread.run(Thread.java: 764), вызванный: io.grpc.StatusException: INVALID_ARGUMENT: предложение Order by не может содержать поле с фильтром равенства, отображаемым в io.grpc.Status.asException(Status.java:541) на com.google.firebase.firestore.util.Util.exceptionFromStatus(Util.java:115) на com.google.firebase.firestore.core.EventManager.onError(EventManager.java: 166) на com.google.firebase.firestore.core.SyncEngine.removeAndCleanupTarget(SyncEngine.java:534) на com.google.firebase.firestore.core.SyncEngine.handleRejectedListen(SyncEngine.java:418) на com.google.firebase.firestore.core.MemoryComponentProvider$RemoteStoreCallback.handleRejectedListen(MemoryComponentProvider.java:99) в com.google.firebase.firestore.remote.Ошибка удаленного хранилища.processTargetError(RemoteStore.java:562) на com.google.firebase.firestore.remote.RemoteStore.handleWatchChange(RemoteStore.java: 446) на com.Google.firebase.firestore.remote.RemoteStore.access за 100 долларов США (RemoteStore.java:53) на com.google.firebase.firestore.remote.Удаленный магазин $ 1.onWatchChange (RemoteStore.java: 176) на com.google.firebase.firestore.remote.WatchStream.onNext(WatchStream.java: 108) на com.google.firebase.firestore.remote.WatchStream.onNext(WatchStream.java:38) на com.google.firebase.firestore.remote.AbstractStream $StreamObserver.lambda$onNext $1(AbstractStream.java:119) на com.google.firebase.firestore.remote.AbstractStream $StreamObserver $$ Lambda $ 2.запустите (неизвестный источник: 4) на com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(AbstractStream.java:67) на com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onNext(AbstractStream.java:110) на com.google.firebase.firestore.remote.FirestoreChannel $ 1.onMessage(FirestoreChannel.java:125) в io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:658) в io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:643) в io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) при вводе-выводе.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) в java.util.concurrent.Исполнители $RunnableAdapter.call(Executors.java:457) в java.util.concurrent.FutureTask.run(FutureTask.java:266) в java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1162) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) на com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:229) на java.lang.Поток.run(Thread.java: 764) с Firestore: (22.0.0) [WatchStream]: (70907c) Поток закрыт со статусом: Status{code= NOT_FOUND, description= Идентификатор цели не найден: 68, причина = null}.

Когда я использовал «предложение where» введите описание изображения здесь

Ответ №1:

Похоже, вы смешиваете синтаксис API из Firebase Realtime Database с синтаксисом Firestore. В Firestore вы можете выполнить этот поиск с помощью:

 db.collection("RESTO_TABLE")
  .orderBy("ville")
  .whereGreaterThanOrEqualTo("ville", s)
  .whereLessThanOrEqualTo("ville", s   "uf8ff")
  

Обновление: синтаксис запроса в Swift отличается. См. https://firebase.google.com/docs/firestore/query-data/queries#swift_2

Комментарии:

1. Спасибо, мистер Франк, за ваш ответ. На самом деле я видел некоторый выбор жанра, но я не смог сделать большой выбор, потому что «где» окрашено в красный цвет. Смотрите прикрепленное изображение спасибо, если у вас есть идея, мне интересно

2. Если имя выделено красным цветом, вы обычно получаете сообщение об ошибке при наведении на него курсора мыши (или в выходных данных компилятора).

3. Точно, когда я наводил курсор на «где», я получал текст: не удается разрешить метод «где» в запросе

4. А, теперь я понимаю. Синтаксис запросов для Swift немного отличается. Смотрите Обновленный код в моем ответе и документы, которые я связал.

5. извините, Франк, я все еще ищу способ выполнить запрос. Условие не выполнено. извините за задержку