#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}.
Ответ №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. извините, Франк, я все еще ищу способ выполнить запрос. Условие не выполнено. извините за задержку