我在 Cloud Firestore 中进行了查询,
CollectionReference questionRef = db.collection("collectionName");
Query query = questionRef.whereEqualTo("field1", "content1")
.whereEqualTo("field2",content2)
.orderBy("field3")
.limit(LIMIT);
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
{
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task)
{
if (task.isSuccessful())
{
for (DocumentSnapshot document : task.getResult())
{
Log.d(TAG, document.getId() + " => " + document.getData());
}
}
else
{
Log.w(TAG, "Error getting documents.", task.getException());
}
}
});
我收到错误,但我有一个索引。
获取文档时出错。 com.google.firebase.firestore.FirebaseFirestoreException: FAILED_PRECONDITION: 查询需要一个索引。你可以在这里创建它: https ://console.firebase.google.com/project/exam-package/database/firestore/indexes?create_index=EglxYmFua2xpc3QaCQoFdmFsaWQQAhoNCgl0aW1lc3RhbXAQAxoMCghfX25hbWVfXxAD com.google.firebase.firestore.g.zzs.zza(SourceFile: 100) 在 com.google.firebase.firestore.b.zzd.zza(SourceFile:122) 在 com.google.firebase.firestore.b.zzab.zza(SourceFile:333) 在 com.google.firebase.firestore.b .zzf.zza(SourceFile:236) 在 com.google.firebase.firestore.f.zzo.zza(SourceFile:6529) 在 com.google.firebase.firestore.f.zzv.zzb(SourceFile:2089) 在 com。 com.google.firebase.firestore.f.zza\(zzb.zza(SourceFile:73) 在 com.google.firebase.firestore.g.zzm\)1.onMessage(SourceFile:77) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java :36) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:36) 在 io.grpc.internal.ClientCallImpl\(ClientStreamListenerImpl\)1MessagesAvailable.runInContext(ClientCallImpl.java:498) 在 io.grpc.internal.ContextRunna ble.run(ContextRunnable.java:37) 在 io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) 在 java.util.concurrent.Executors\(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.g.zza\)zza.run(SourceFile:190) 在 java.lang.Thread.run(Thread. java:764) Caused by: io.grpc.StatusException: FAILED_PRECONDITION: 查询需要一个索引。您可以在此处创建它: https ://console.firebase.google.com/project/exam-package/database/firestore/indexes?create_index=EglxYmFua2xpc3QaCQoFdmFsaWQQAhoNCgl0aW1lc3RhbXAQAxoMCghfX25hbWVfXxAD 在 io.grpc.Status.asException(Status.java:534) at .google.firebase.firestore.g.zzs.zza(SourceFile:98) 在 com.google.firebase.firestore.b.zzd.zza(SourceFile:122) 在 com.google.firebase.firestore.b.zzab.zza (SourceFile:333) 在 com.google.firebase.firestore.b.zzf.zza(SourceFile:236) 在 com.google.firebase.firestore.f.zzo.zza(SourceFile:6529) 在 com.google.firebase。 firestore.f.zzv.zzb(SourceFile:2089) 在 com.google.firebase.firestore.f.zza\(zzb.zza(SourceFile:73) 在 com.google.firebase.firestore.g.zzm\)1.onMessage(SourceFile :77) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:36) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:36) 在 io.grpc.internal.ClientCallImpl\(ClientStreamListenerImpl\)1MessagesAvailable.runInContext(ClientCallI) mpl.java:498) 在 io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) 在 io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) 在 java.util.concurrent.Executors\(RunnableAdapter .call(Executors.java:457) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ScheduledThreadPoolExecutor\)ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) 在 java.util。 com.google.firebase.firestore.g.zza$zza.run(源文件: 190) 在 java.lang.Thread.run(Thread.java:764)
原文由 Jack Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议
我遇到了这个问题,我开始知道我们必须为数据库创建索引。
您可以通过简单的解决方案解决此问题。
首先在 LOG 类中显示错误信息。
例如
Log.e(TAG, task.getException().getLocalizedMessage);
在 Logcat 窗口中,您将看到带有 链接 的消息。
单击该链接,它将打开 firebase 控制台网站并显示一个用于创建索引的对话框弹出窗口。
只需单击“ 添加索引”按钮。
然后刷新应用程序。它会起作用!
并根据您的代码:
看起来您已经为“field3”添加了索引,但在控制台中确保该索引正确且已启用。