Невозможно получить объекты из Firestore - PullRequest
0 голосов
/ 08 октября 2019

Я новичок в Firebase и Kotlin, и пытаюсь подать заявку на него. У меня есть класс данных с именем Announcements, и я сохранил данные для Announcements в Firestore. Однако, когда я хотел получить свои данные из Firestore, он продолжал выдавать мне следующую ошибку:

2019-10-09 03:14:13.016 14552-14552/com.example.finalyearproject W/Firestore: (21.1.1) [CustomClassMapper]: No setter/field for Content found on class com.example.finalyearproject.Announcement
2019-10-09 03:14:13.017 14552-14552/com.example.finalyearproject W/Firestore: (21.1.1) [CustomClassMapper]: No setter/field for Title found on class com.example.finalyearproject.Announcement
2019-10-09 03:14:13.017 14552-14552/com.example.finalyearproject W/Firestore: (21.1.1) [CustomClassMapper]: No setter/field for Id found on class com.example.finalyearproject.Announcement
2019-10-09 03:14:13.018 14552-14552/com.example.finalyearproject W/Firestore: (21.1.1) [CustomClassMapper]: No setter/field for Date found on class com.example.finalyearproject.Announcement

Ниже приведены мои коды:

val db = FirebaseFirestore.getInstance()
val announcement = Announcement(_aTitle = "Hello Everyone", _aContent = "A new age begins.", _aDate = Date())
announcement.writeToDatabase()

val mAnnouncements: ArrayList<Announcement> = ArrayList()

db.collection(Announcement.ANNOUNCEMENT_COLLECTION).get().addOnSuccessListener {
            mAnnouncements.addAll(it.toObjects(Announcement::class.java))
}

Класс объявления:

class Announcement(_aId: UUID = UUID.randomUUID(), _aTitle: String = " ", _aContent: String = " ", _aDate: Date = Date()) {

    var aId = _aId
    var aTitle = _aTitle
    var aContent = _aContent
    var aDate = _aDate

    fun writeToDatabase() {

        val db = FirebaseFirestore.getInstance()

        val write = hashMapOf(
            ANNOUNCEMENT_ID to this.aId,
            ANNOUNCEMENT_TITLE to this.aTitle,
            ANNOUNCEMENT_CONTENT to this.aContent,
            ANNOUNCEMENT_DATE to this.aDate
        )

        db.collection(ANNOUNCEMENT_COLLECTION).document(this.aId.toString()).set(write).addOnSuccessListener { Log.d("Success", "Success") }


    }

    companion object {
        const val ANNOUNCEMENT_COLLECTION = "announcement"
        const val ANNOUNCEMENT_ID = "Id"
        const val ANNOUNCEMENT_TITLE = "Title"
        const val ANNOUNCEMENT_CONTENT = "Content"
        const val ANNOUNCEMENT_DATE = "Date"
    }
}

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

Пожалуйста, помогите, если кто-нибудь сможет решить мои вопросы. Заранее спасибо!

1 Ответ

0 голосов
/ 08 октября 2019

Если вы хотите использовать класс данных Kotlin с documentSnapshot.toObject , вам придется сделать каждое поле класса данных обнуляемым var. Firestore SDK не знает, как отобразить поля документа в аргумент конструктора класса данных. Если поля имеют значение NULL val, то компилятор Kotlin создаст методы получения и установки для каждого поля, чтобы они могли быть обнаружены и вызваны с помощью Firestore SDK.

Если вам нужен правильный неизменяемый класс данных с val fields, вам нужно будет вручную прочитать каждое поле из документа и вызвать конструктор класса данных самостоятельно.

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