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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:46:47