Android FireStore回收选项。当不需要索引时,查询需要索引错误。只有当我使用orderBy时

Android FireStore回收选项。当不需要索引时,查询需要索引错误。只有当我使用orderBy时,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我正在使用Firestore数据库和FirebaseUI将结果加载到android kotlin中的回收器视图中。我正在经历一些奇怪的事情 我理解在不同字段上发出过多不同请求时出现的错误“查询需要索引”。但是,我知道您可以提出许多请求,其中包括一个请求orderBy。现在,当我自己提出这个请求时(不使用FirestoreRecyclerOptions)。我没有问题,而且效果很好 但是,当我将请求与FirestoreRecyclerOptions一起使用时,例如: var querySearch

我正在使用Firestore数据库和FirebaseUI将结果加载到android kotlin中的回收器视图中。我正在经历一些奇怪的事情

我理解在不同字段上发出过多不同请求时出现的错误“查询需要索引”。但是,我知道您可以提出许多请求,其中包括一个请求orderBy。现在,当我自己提出这个请求时(不使用FirestoreRecyclerOptions)。我没有问题,而且效果很好

但是,当我将请求与FirestoreRecyclerOptions一起使用时,例如:

 var querySearch = FirebaseFirestore.getInstance()
            .collection(DB_DEALS_COLLECTION).document(departureCountry.toString()).collection(DB_DEALS_SUB_COLLECTION)
            .whereEqualTo(FILTER_FIELD_APR, true)
            .whereEqualTo(FILTER_FIELD_AUG, true)
            .whereEqualTo(FILTER_FIELD_DEC, true)
            .orderBy(FILTER_FIELD_TIMESTAMP, Query.Direction.DESCENDING).limit(15)

        val options = FirestoreRecyclerOptions.Builder<Deal>().setQuery(querySearch, Deal::class.java).build()
现在我不想让这些字段升序,只想让时间戳升序

注意:这仅在我包括以下内容时发生:

.orderBy(FILTER_FIELD_TIMESTAMP, 
在控制台中,我还看到,
limitType=LIMIT\u TO\u FIRST
。我还看到,
-\uuuuu name\uuuuu
。这些是什么,我从来没有设置过

我希望我的问题是清楚的,我对这一切有点困惑


谢谢

如果您的查询确实需要索引,您应该能够通过覆盖
FirebaseRecyclerAdapter
轻松创建索引:

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<T, H>(options) {
   // ... 

    @Override
    public void onError(@NonNull FirebaseFirestoreException e) {
        Log.w(TAG, "onError", e);
    }
};
FirestoreRecyclerAdapter=新的FirestoreRecyclerAdapter(选项){
// ... 
@凌驾
public void onError(@NonNull FirebaseFirestoreException e){
Log.w(标签“onError”,e);
}
};
然后在logcat中,您将看到完整的错误,其中包括一个链接,您可以单击该链接自动创建缺少的索引

至于你的其他问题:

  • 您是否从同一设备创建数据?如果是这样的话,这就解释了为什么尽管出现了错误,您仍会在
    RecyclerView
    中看到数据。它来自不使用索引的脱机缓存
  • .limit(15)
    是说
    .limitToFirst(15)
    的一种不太冗长的方式。因此,您可以忽略
    limitType=LIMIT\u TO\u FIRST
  • \uuuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

如果您的查询确实需要索引,您应该能够通过覆盖
FirebaseRecyclerAdapter
轻松创建索引:

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<T, H>(options) {
   // ... 

    @Override
    public void onError(@NonNull FirebaseFirestoreException e) {
        Log.w(TAG, "onError", e);
    }
};
FirestoreRecyclerAdapter=新的FirestoreRecyclerAdapter(选项){
// ... 
@凌驾
public void onError(@NonNull FirebaseFirestoreException e){
Log.w(标签“onError”,e);
}
};
然后在logcat中,您将看到完整的错误,其中包括一个链接,您可以单击该链接自动创建缺少的索引

至于你的其他问题:

  • 您是否从同一设备创建数据?如果是这样的话,这就解释了为什么尽管出现了错误,您仍会在
    RecyclerView
    中看到数据。它来自不使用索引的脱机缓存
  • .limit(15)
    是说
    .limitToFirst(15)
    的一种不太冗长的方式。因此,您可以忽略
    limitType=LIMIT\u TO\u FIRST
  • \uuuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

谢谢。正如我在问题中所说,我已经关注了链接。问题是每个不同的查询都需要一个新的链接来修复。我仍然不知道为什么这些查询需要一个索引?CloudFireStore中的每个查询都必须命中一个索引。一些简单索引是内置的(其中equalto或orderBy位于单个字段上),其他索引必须创建。如果有许多不同的组合,确实需要创建许多索引。但我在问题中解释过,我使用的字段查询不需要创建索引。只有当我使用Firebase适配器进行查询时,我才得到错误。我不认为这是真的,您是否尝试过在FirebaseUI之外的查询中查找错误?使用适配器的查询和不使用适配器的查询没有区别(上下文:我编写了适配器)。我在适配器之外进行查询,没有错误!谢谢正如我在问题中所说,我已经关注了链接。问题是每个不同的查询都需要一个新的链接来修复。我仍然不知道为什么这些查询需要一个索引?CloudFireStore中的每个查询都必须命中一个索引。一些简单索引是内置的(其中equalto或orderBy位于单个字段上),其他索引必须创建。如果有许多不同的组合,确实需要创建许多索引。但我在问题中解释过,我使用的字段查询不需要创建索引。只有当我使用Firebase适配器进行查询时,我才得到错误。我不认为这是真的,您是否尝试过在FirebaseUI之外的查询中查找错误?使用适配器的查询和不使用适配器的查询没有区别(上下文:我编写了适配器)。我在适配器之外进行查询,没有错误!