【发布时间】:2018-10-24 07:18:38
【问题描述】:
从 Firestore 获取数据时,我无法获取时间戳字段。
我的 Room 文档的结构如下:
我正在从 Firestore 获取房间,如下所示。
助手类:
fun getRooms(userId: String): Task<QuerySnapshot> {
return FirebaseFirestore.getInstance()
.collection(KEY_USERS).document(userId)
.collection(KEY_ROOMS).get()
}
交互类:
private fun getRooms(): Task<List<Room>> {
val source = TaskCompletionSource<List<Room>>()
val listener = OnCompleteListener<QuerySnapshot> {
if (it.isSuccessful) {
val roomSnapshots = it.result
if (!roomSnapshots.isEmpty) {
val rooms = ArrayList<Room>()
for (roomSnapshot in roomSnapshots) {
rooms.add(Room(roomSnapshot))
}
source.setResult(rooms)
}
} else {
source.setException(it.exception!!)
}
}
FirebaseFireStoreHelper.getRooms(mUserId).addOnCompleteListener(listener)
return source.task
}
我的Room模特班:
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 lateinit var mDateCreated: Date
private lateinit var mTitle: String
init {
if (document.exists()) {
mId = document.id
mDateCreated = document.getDate(KEY_DATE_CREATED)!!
mTitle = document.getString(KEY_TITLE)!!
}
}
fun getId(): String = mId
fun getDateCreated(): Date? = mDateCreated
fun getTitle(): String = mTitle
}
问题是document.getDate(KEY_DATE_CREATED) 总是返回null。我尝试使用get(KEY_DATE_CREATED) 和getString(KEY_DATE_CREATED) 只是为了看看我是否可以获得任何价值,但无济于事。
再试几次后,我测试打印出整个对象并能够得到这个:
DocumentSnapshot{
key=users/kCKkmgLmLGfvbPFK09qyZ5uoyw32/rooms/R35Bj56rda7pkkYWH1MQ,
metadata=SnapshotMetadata{
hasPendingWrites=false,
isFromCache=false
},
doc=Document{
key=users/kCKkmgLmLGfvbPFK09qyZ5uoyw32/rooms/R35Bj56rda7pkkYWH1MQ,
data=zza{
(title=>Sample Room)
};,
version=SnapshotVersion(seconds=1523285961, nanos=350799000),
hasLocalMutations=false
}
}
显然,dateCreated 字段一开始就没有被检索到,这解释了 null 值。从我拥有的代码来看,我相信我正在正确处理解析。令人困惑的是我还有一个 Message 对象,它有一个 dateCreated 时间戳字段,我能够正确获取它。
P.S.:示例代码在 Kotlin 中,如果可以帮助使事情更清楚,我可以发布 Java 代码版本。
更新:这是 Firestore 消息文档的屏幕截图。
这是我的Message 模型类:
class Message(document: DocumentSnapshot) {
companion object {
private const val KEY_CONTENT = "content"
private const val KEY_DATE_CREATED = "dateCreated"
}
private lateinit var mId: String
private lateinit var mContent: String
private lateinit var mDateCreated: Date
// TODO: Figuring out why getDate doesn't seem to work for Rooms
init {
if (document.exists()) {
mId = document.id
mContent = document.getString(KEY_CONTENT)!!
mDateCreated = document.getDate(KEY_DATE_CREATED)!!
}
}
fun getId(): String = mId
fun getContent(): String = mContent
fun getDateCreated(): Date = mDateCreated
fun getStringFormattedDateCreated() = FormatterUtil.getFormattedTimestamp(mDateCreated)
}
使Room 的日期可以为空 (?) 没有任何作用。
【问题讨论】:
-
JS客户端SDK有个firebase.firestore().settings({ timestampsInSnapshots: true });所以想知道会不会是这样。
-
嘿@andyfusniak。我没有为 Firestore 使用任何额外的设置。
Message的那个工作正常,但Room却不行。所以我认为不需要其他额外的设置。谢谢。
标签: android firebase google-cloud-firestore