Firebase.firestore与FirebaseFirestore.getInstance()的区别及相关问题咨询
1. Firebase.firestore 与 FirebaseFirestore.getInstance() 的区别及更新数据库时的选择
- 区别:
Firebase.firestore是 Kotlin/Android 中 Firebase 库提供的属性访问语法糖,内部实际调用的仍是FirebaseFirestore.getInstance(),写法更简洁。FirebaseFirestore.getInstance()是 Java 风格的静态方法调用,是获取 Firestore 实例的标准方式。
- 更新数据库的选择: 两者获取的是同一个单例实例,功能完全一致,任选其一即可。推荐使用
Firebase.firestore,更符合 Kotlin 的简洁风格。
2. 读取 QuerySnapshot 的字段和值
你当前代码打印的是整个 QuerySnapshot 对象的字符串表示,而非单个文档的内容。修改后的代码如下:
db.collection("users").whereEqualTo("userId", userId?.toInt()) .get() .addOnSuccessListener { querySnapshot -> for (document in querySnapshot) { // 打印文档所有字段和值 Log.d("결과", document.data.toString()) // 读取特定字段示例 val userName = document.getString("name") val userAge = document.getLong("age") Log.d("결과", "用户名: $userName, 年龄: $userAge") } }
- 关键说明:
querySnapshot是查询返回的文档集合,遍历它可拿到单个DocumentSnapshot对象(即代码中的document)。document.data返回文档的完整键值对映射,转字符串即可查看全部内容。- 使用
getString()、getLong()等方法可精准读取指定字段,注意字段类型需与 Firestore 中存储的类型匹配。
3. 事务更新代码报错排查
报错原因是你传给 transaction.update() 的是查询对象(Query),而事务的 update 方法需要的是具体的文档引用(DocumentReference)。修正后的代码:
val db = Firebase.firestore db.runTransaction { transaction -> // 事务内执行查询获取目标文档 val querySnapshot = transaction.get(db.collection("users").whereEqualTo("userId", userId?.toInt())) if (querySnapshot.isEmpty) { throw Exception("目标文档不存在") } // 获取第一个匹配文档的引用 val targetDocRef = querySnapshot.documents.first().reference // 执行更新操作 transaction.update(targetDocRef, "name", "new name") null }.addOnSuccessListener { Log.d("결과", "Transaction success!") }.addOnFailureListener { e -> Log.e("결과", "Transaction failed: ${e.message}") }
- 关键说明:
- 事务内部必须通过
transaction.get()执行查询,确保操作的原子性,不能直接使用外部查询结果。 - 需先检查查询结果是否为空,避免空指针异常。
- 从查询结果中提取具体的
DocumentReference后,再调用transaction.update()完成更新。
- 事务内部必须通过
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

