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
相关产品推荐
相关产品推荐

