При получении данных из Firestore, я не могу получить поле метки времени.
Документ моей комнаты структурирован следующим образом:
и я получаю комнаты из 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
не извлекается в первую очередь, что объясняет нулевое значение.Исходя из кода, который я имею, я считаю, что я правильно разбираюсь с парсингом.Что сбивает с толку, так это то, что у меня также есть объект Message
с полем отметки времени dateCreated
, и я могу получить его правильно.
PS: примеры кодов находятся в Kotlin, я мог бы опубликовать код Javaверсия, если это может помочь сделать вещи более ясными.
Обновление: Вот скриншот документа Message из 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
, ничего не делает.