Firestore无法获取Room文档的Timestamp字段问题求助
解决Firestore中Room文档无法获取Timestamp类型dateCreated字段的问题
从你的描述和打印的DocumentSnapshot来看,核心问题非常明确:你查询到的那个Room文档根本没有包含dateCreated字段(打印结果里只有title=>Sample Room),所以不管用getDate()、get()还是getString()都拿不到值。而Message文档能正常获取,说明你的解析逻辑本身没问题,问题大概率出在Room文档的写入环节或者查询的文档对象上。
一步步排查与修复
1. 先确认目标文档的实际内容
你打印的文档ID是R35Bj56rda7pkkYWH1MQ,直接去Firestore控制台找到这个具体的Room文档:
- 检查它是否真的存在
dateCreated字段,且类型是Timestamp - 确认字段名和你代码里的
KEY_DATE_CREATED = "dateCreated"完全一致(Firestore字段名大小写敏感,别写成DateCreated或者datecreated)
如果这个文档确实没有dateCreated,那问题出在写入Room数据的代码里——你可能在创建Room时忘记添加这个字段了。
2. 检查Room的写入逻辑
对比Message的写入代码,确保Room写入时正确添加了dateCreated字段。比如正确的写入示例应该是这样的:
// 写入Room数据到Firestore val roomMap = hashMapOf( "title" to "Sample Room", "dateCreated" to Timestamp.now() // 必须添加这个字段,类型为Timestamp ) FirebaseFirestore.getInstance() .collection(KEY_USERS) .document(userId) .collection(KEY_ROOMS) .add(roomMap) // 或者用set()方法
3. 优化模型类的容错处理
即使字段存在,也建议给dateCreated做可空处理,避免空指针异常:
class Room(document: DocumentSnapshot) { companion object { private const val KEY_DATE_CREATED = "dateCreated" private const val KEY_TITLE = "title" } private lateinit var mId: String private var mDateCreated: Date? = null // 改为可空类型 private lateinit var mTitle: String init { if (document.exists()) { mId = document.id // 直接获取Timestamp再转Date,比getDate()更直观 val timestamp = document.getTimestamp(KEY_DATE_CREATED) mDateCreated = timestamp?.toDate() mTitle = document.getString(KEY_TITLE)!! } } fun getId(): String = mId fun getDateCreated(): Date? = mDateCreated fun getTitle(): String = mTitle }
4. 确认查询路径的正确性
检查getRooms()方法中的集合路径:
fun getRooms(userId: String): Task<QuerySnapshot> { return FirebaseFirestore.getInstance() .collection(KEY_USERS).document(userId) .collection(KEY_ROOMS).get() }
确保KEY_USERS和KEY_ROOMS的常量值和Firestore中的集合名完全一致,避免因为路径错误查询到了其他不包含dateCreated的文档集合。
总结
你的解析逻辑是没问题的(Message能正常获取就是证明),重点要排查:
- 目标Room文档是否真的写入了
dateCreated字段 - 写入Room时的代码是否遗漏了该字段
- 查询路径是否正确,有没有拿到错误的文档
内容的提问来源于stack exchange,提问作者AL.
相关产品推荐
相关产品推荐

