代码之家  ›  专栏  ›  技术社区  ›  najm

Firebase QuerySnapshot为复合查询返回null

  •  0
  • najm  · 技术社区  · 7 年前

    对于我的应用程序,我实现了一个过滤器选项。我使用火箭筒 Query 使用所述过滤器进行查询。以下是实施:

    private void loadDestinations() {
        Query query = App.getFirestore().collection("destinations");
    
        if (mFilters.hasCountry()) {
            query = query.whereEqualTo(Destination.FIELD_COUNTRY, mFilters.getCountry());
        }
    
        if (mFilters.hasPrice()) {
            query = query.whereEqualTo(Destination.FIELD_PRICE, mFilters.getPrice());
        }
    
        if (mFilters.hasSortBy()) {
            query = query.orderBy(mFilters.getSortBy(), mFilters.getSortDirection());
        }
    
        query.addSnapshotListener((documentSnapshots, e) -> {
            if (documentSnapshots != null) {
                if (!documentSnapshots.isEmpty()) {
                    Log.d(LOG_TAG, "Snapshots are not null and have value");
                    List<Destination> destinationList = documentSnapshots.toObjects(Destination.class);
                    mDestinations.setValue(destinationList);
                } else {
                    Log.d(LOG_TAG, "Snapshots are not null but have no value");
                    mDestinations.setValue(new ArrayList<>());
                }
            } else {
                Log.e(LOG_TAG, "Snapshots are NULL!");
                mDestinations.setValue(new ArrayList<>());
            }
        });
    }
    

    看看第二行,我在其中实例化 query 对象然后,我对用户添加的每种类型的过滤器(国家、价格、排序)进行复合。

    现在,如果我将国家/地区和价格组合在一起,这将非常好地加载,但只要我添加排序aka query.orderBy() 这个 documentSnapshots 第17行返回null。更奇怪的是,如果使用复合查询,snapshotListener会检索两次数据。第一次记录时:

    快照不为null且具有值

    然后立即记录

    快照为空!

    即使 loadDestinations() 方法被调用了一次(我检查了)。

    我可以肯定的是,大约一个月前,这不是一个问题,因为那时我开发了这个部分并测试了它。但现在,出于原因,它正以这种方式行事。API是否有任何重大变化?代码有故障吗?

    额外费用: 比如,在第2行,我添加了另一个 .whereEqualTo() 像这样:

    Query query = App.getFirestore().collection("destinations").whereEqualTo("approved", true);

    侦听器将返回空值,只添加一个过滤器(而不是之前的两个过滤器)。我之所以提到这一点,是因为我认为这与数据的排序方式无关,更重要的是,复合查询不起作用。出于某种原因,它会再次重试,直到为null。我也不认为这是关于创建索引的,因为我一个月前就已经这样做了。此外,它会在日志中提到同样多的内容。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Todd Kerpelman    7 年前

    我怀疑发生的情况是,在一个字段上执行“等于”查询,再在另一个字段上执行“排序方式”,需要创建一个复合索引才能运行此查询。

    通常,您会获得在错误对象中创建此自定义索引的URL,因此我强烈建议您先检查错误对象的内容,然后记录其内容。

    (即使这不是原因,但不管怎样,养成检查错误对象的习惯总是一个好主意。这可能会帮助你避免将来出现一堆神秘的错误。)