我正在尝试测试我的 Android 应用程序,该应用程序使用来自 Firebase Firestore 的数据。但是,我在使用本地运行的 Firebase Firestore 模拟器和 Android 模拟器查询数据时遇到问题。
当我使用 Android 模拟器从 Cloud Firestore 查询数据时,一切正常。当我从模拟器 Firestore 查询数据时,我收到一个空的 DataSnapshot。
两个 Firestore 实例(本地模拟器和云 Firestore)包含相同的数据。
当我在 Android 模拟器的浏览器中输入
10.0.2.2.:4001
时,我会看到 Firebase Emulator Suite
,并且可以看到 Firestore 模拟器状态为 On
。在我看来,这意味着存在与我本地运行的 Firestore 模拟器的连接。
我的用于初始化 Firestore 实例的代码:
private val db = Firebase.firestore
db.useEmulator("10.0.2.2", 8080)
db.firestoreSettings = firestoreSettings { isPersistenceEnabled = false }
val docVal = db.collection("district_codes")
.document("district_codes")
.get()
.await()
我正在运行的本地 Firestore 模拟器的日志:
┌─────────────────────────────────────────────────────────────┐
│ ✔ All emulators ready! It is now safe to connect your app. │
│ i View Emulator UI at http://127.0.0.1:4001/ │
└─────────────────────────────────────────────────────────────┘
┌───────────┬────────────────┬─────────────────────────────────┐
│ Emulator │ Host:Port │ View in Emulator UI │
├───────────┼────────────────┼─────────────────────────────────┤
│ Firestore │ 127.0.0.1:8080 │ http://127.0.0.1:4001/firestore │
└───────────┴────────────────┴─────────────────────────────────┘
Emulator Hub running at 127.0.0.1:4401
Other reserved ports: 4501, 9150
为什么我无法从本地运行的 Firebase Firestore 实例检索数据,而从 Cloud Firestore 实例检索数据却可以正常工作?
更新 我尝试用一个简单的测试条目来测试它:在路径
/Test/doc_test
中,我添加了一个名为test_field
的字符串字段。
我使用以下命令检索它:
val docVal = db.collection("Test").document("doc_test").get().await()
val foundValue = docVal.get("test_field") as String?
Log.i(TAG_FIRESTORE, "Found following test value: ${foundValue} - ${docVal}")
并获取以下日志条目:
找到以下测试值:null - DocumentSnapshot{key=Test/doc_test,metadata=SnapshotMetadata{hasPendingWrites=false, isFromCache=false}, doc=null}
该问题是由于使用了错误的项目 ID 引起的。在 Firestore-debug.log 文件中,以下条目突出显示了该问题:
Multiple projectIds are not recommended in single project mode. Requested project ID <my_project>, but the emulator is configured for <my_project>_testing.
发生这种情况是因为我为模拟器使用的项目 ID 与为云中的 Firebase Firestore 配置的项目 ID 不同。
为了解决此问题,我更新了模拟器配置中的项目 ID,以匹配 Firebase Firestore 中使用的项目 ID。