【问题标题】:Firebase Firestore toObject() with Kotlin使用 Kotlin 的 Firebase Firestore toObject()
【发布时间】:2018-03-19 21:26:49
【问题描述】:

我尝试在 Kotlin 项目中使用 Firebase Firestore。一切都很好,除非我想用 DocumentSnapshot.toObject(Class valueType) 实例化一个对象。

代码如下:

FirebaseFirestore
    .getInstance()
    .collection("myObjects")
    .addSnapshotListener(this,
    { querySnapshot: QuerySnapshot?, e: FirebaseFirestoreException? ->

        for (document in querySnapshot.documents) {

            val myObject = document.toObject(MyObject::class.java)

            Log.e(TAG,document.data.get("foo")) // Print : "foo"
            Log.e(TAG, myObject.foo) // Print : ""
        }
    }
})

如您所见,当我使用documentChange.document.toObject(MyObject::class.java) 时,我的对象已实例化,但内部字段未设置。 我知道 Firestore 需要模型有一个空的构造函数。所以这是模型:

class MyObject {

    var foo: String = ""

    constructor(){}

}

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

    标签: kotlin google-cloud-firestore


    【解决方案1】:

    你忘了包含带参数的公共构造函数,或者你也可以只使用带有默认值的数据类,应该足够了:

    data class MyObject(var foo: String = "")
    

    【讨论】:

    • 使用数据类可能是最好的选择,因为它会为每个字段创建公开命名的 getter/setter。 Firestore 数据映射器会查找这些(因此要实例化 foo,它需要 public setFoo()
    • 并且没有默认构造函数的失败模式几乎没有用 - 你会得到“java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect. Constructor.newInstance(java.lang.Object[])' 在空对象引用上。
    • 所有 Kotlin 类都会为每个公共 var 字段生成公开命名的 getter 和 setter,并为每个公共 val 字段生成公开命名的 getter。不仅是数据类。
    • 为避免错误,只需创建一个数据类并在空构造函数中调用主构造函数,如constructor() : this("", null, 0)
    【解决方案2】:

    在我的情况下,我得到一个 NullPointerException 因为没有默认构造函数。 使用具有默认值的数据类修复了错误。

    data class Message(
            val messageId : String = "",
            val userId : String = "",
            val userName : String = "",
            val text : String = "",
            val imageUrl : String? = null,
            val date : String = ""
    )
    

    【讨论】:

      【解决方案3】:
      class MyObject {
      
          lateinit var foo: String
      
          constructor(foo:String) {
              this.foo = foo
          }
      
          constructor()
      
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-26
        • 2021-12-29
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        相关资源
        最近更新 更多