You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud Firestore查询未返回全部文档,切换服务器读取遇权限问题

Cloud Firestore 查询异常与权限问题

问题概述

我在Cloud Firestore中存储了数千个文档,每个文档都包含Best score字段——该字段多数为String类型,部分为Long类型(正在逐步删除String类型的文档)。当前遇到两个问题:

  • 初始查询仅返回两个文档:一个是已删除的名为“initial”的文档,另一个是测试设备对应的文档,无法获取其他文档。
  • 怀疑是缓存导致的问题,修改代码强制从服务器获取数据后,却触发了权限错误,但数据库规则已设置为允许所有人读写。

应用未启用身份验证,通过设备标识符追踪用户文档,获取设备ID的代码如下:

// 获取用户设备ID,用于定位用户文档,不存在则创建
androidID = Settings.Secure.getString(getContentResolver(),
         Settings.Secure.ANDROID_ID);

数据库结构

集合deviceIDs下包含多个以设备ID命名的文档,每个文档内除了Best score字段外,还有coins、currentLevel等其他字段。

数据库规则

当前设置的规则为完全开放权限,允许所有用户读写任意文档,规则代码如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

初始查询代码

private static final String FSBESTSCORE = "Best score";
private static final String DEVICEIDS = "deviceIDs";

baseRef = db.collection(DEVICEIDS);

spinner.setVisibility(View.VISIBLE);
Query firstQuery = baseRef.orderBy(FSBESTSCORE, Query.Direction.ASCENDING)
                          .whereNotEqualTo(FSBESTSCORE, "")
                          .limit(MAX_CHUNK_SIZE);
registration = firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot value,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }
        // 处理查询结果的逻辑
    }
});

修改后的查询代码(强制从服务器获取)

为避开缓存影响,修改为直接从服务器拉取数据,代码如下:

spinner.setVisibility(View.VISIBLE);
Query firstQuery = baseRef.orderBy(FSBESTSCORE, Query.Direction.ASCENDING)
                          .whereNotEqualTo(FSBESTSCORE, "")
                          .limit(MAX_CHUNK_SIZE);

firstQuery.get(Source.SERVER).addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        spinner.setVisibility(View.GONE);
        if (task.isSuccessful()) {
            QuerySnapshot querySnapshot = task.getResult();
            if (querySnapshot != null && !querySnapshot.isEmpty()) {
                // 处理查询结果的逻辑
            }
        } else {
            // 权限错误触发在此处
            Log.e(TAG, "查询失败", task.getException());
        }
    }
});

内容的提问来源于stack exchange,提问作者FractalBob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:03:25