Невозможно получить поле документа Timestamp из Firestore - PullRequest
0 голосов
/ 14 мая 2018

При получении данных из Firestore, я не могу получить поле метки времени.

Документ моей комнаты структурирован следующим образом:

enter image description here

и я получаю комнаты из 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.

enter image description here

А вот мой класс 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, ничего не делает.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Если я правильно понял эту проблему, вам нужно установить параметры моментального снимка, или же вы не ожидаете полного результата.

Я использую платформу Node.js, чтобы вывам нужно будет сделать эквивалент для вашего SDK.

Если установлено, контролирует возвращаемое значение для временных меток сервера, для которых еще не установлено их окончательное значение.

Указав 'оценивать », ожидающие метки времени сервера возвращают оценку, основанную на локальных часах.Эта оценка будет отличаться от окончательного значения и приведет к изменению этих значений, как только станет доступен результат сервера.

При указании «предыдущего» отложенные метки времени будут игнорироваться и вместо этого будут возвращать свое предыдущее значение.

Если опущено или установлено значение «none», по умолчанию будет возвращаться значение null до тех пор, пока значение сервера не станет доступным

Здесь приведена ссылка на клиентский SDK Node.js.Это может помочь вам в правильном направлении.https://firebase.google.com/docs/reference/js/firebase.firestore.SnapshotOptions

0 голосов
/ 18 мая 2018

Во-первых, вам нужно сохранить имена в вашем элементе POJO с теми же именами вашей базы данных, все ваши POJOs в примерах написаны с аннотацией camelCase, а в вашей базе данных это не так.

Если вы хотите сохранить свою модель с camelCase и базу данных без нее, вы можете использовать аннотацию PropertyName:

data class myFancyPojo(@PropertyName("name") val mName: String = "",
                   @ServerTimestamp
                   @PropertyName("timestamp")
                   val mTimestamp: Date? = null)

Вы пропустили аннотацию @ServerTimestamp для вашего параметра вPOJO-компоновщик, который помечает его как завышенный из отметки времени сервера.

Аннотация, используемая для пометки поля даты, которое должно быть заполнено отметкой времени сервера.Если записываемый POJO содержит ноль для поля, помеченного @ ServerTimestamp, он будет заменен сгенерированной сервером отметкой времени.

https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/ServerTimestamp

Наконец, не забудьтечто если вы пишете свой код на Java, вы должны оставить пустой конструктор, а если вы пишете его на Kotlin, вы должны задать значение по умолчанию для любого параметра класса.

0 голосов
/ 14 мая 2018

Кажется, что не правильно анализирует формат даты.

С помощью firebase я конвертирую дату в значение метки времени Unix, сохраняя это значение в firebase.Вы можете сделать это с помощью метода getTime ().

И когда я получаю данные, я конвертирую значение метки времени Unix в тип Date.

Date date = new Date((long)timeStamp*1000);

Пример:

Данные ------> Отметка времени Unix

05/14/2018 @ 15:26 (UTC) ------> 1526311610

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...