【问题标题】:Class is missing a constructor with no arguments - but I've provided a constructor类缺少一个没有参数的构造函数 - 但我提供了一个构造函数
【发布时间】:2018-05-13 18:38:33
【问题描述】:

我正在尝试在用户从 Firebase 登录后检索他们的信息。我有一个偷偷摸摸的怀疑,这个错误实际上不是我的问题 - 并且必须处理我使用ServerValue.Timestamp 来存储用户注册时的日期/时间的事实(因为我正在尝试将 dateJoined 拉回来,我的班级不知道如何处理它)。我的数据库看起来像这样:

登录时,这是我用来抓取用户信息的代码

//grab user's name from firebase
//drill down to specific user
val usersRef = FirebaseDatabase.getInstance().getReference("Users")
val loggedInUserRef = usersRef.child(user.uid) //specific to the logged in user
val dataRef = loggedInUserRef.child("UserInfo") //get logged in user info
//attach listener
dataRef.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        // Get Post object and use the values to update the UI
        val user_data = dataSnapshot.getValue(User::class.java)
        Log.w(TAG, dataSnapshot.value.toString())

        //add relevant data to shared preferences
        prefs.userName = "$user_data.FirstName $user_data.LastName"
    }

    override fun onCancelled(databaseError: DatabaseError) {}
})

我的用户类在一个单独的文件中:

package androidproject.project_rc

    data class User(
            var FirstName: String = "",
            var LastName: String = "",
            var Email: String = "",
            var Password: String = "",
            var DateJoined: Any
    )

围绕这一行:val user_data = dataSnapshot.getValue(User::class.java) 是引发错误的地方 - 给出了什么?

【问题讨论】:

    标签: android firebase-realtime-database kotlin


    【解决方案1】:

    查看文档Here

    当使用 snap.getValue(Class) getter 时,类应该有一个 0 参数的构造函数。

    很遗憾,您不能以这种方式使用数据类。只需将您的课程改写为

    class User(){
        var firstName: String = ""
        var lastName: String = ""
        var email: String = ""
        var password: String = ""
        var dateJoined: Long = 0L
    }
    

    您可能希望使用小写的变量名,因为这是约定俗成的。 此外,您可以避免使用 Any for dateJoined,因为我认为它是 UTC 时间戳。

    firebase sdk 将检查每个数据库键是否存在该名称的 setter/public 字段,如果存在,则设置它。 Kotlin 会自动生成 setter 和 getter,因此您只需确保成员的名称与数据库中的键相同。

    尽管其中一位开发人员曾经说过(这似乎没有出现在文档中),sdk 将尝试访问多种命名样式。这很模糊,所以最好确保匹配数据库键。

    【讨论】:

    • 做到了!非常感谢!
    • “很遗憾,您不能以这种方式使用数据类。”这不遵循,一个数据类可以有一个0参数的构造函数。
    【解决方案2】:

    不确定 Kotlin(从未使用过),但我认为 pojo 字段名称必须与 Firebase 条目名称匹配

    喜欢:

    var 密码: String = "",

    大写“P”,但在您的 Firebase 中,“密码”用小写字母拼写。

    【讨论】:

    • 没有帮助 - 我在同一行仍然遇到同样的错误 - 如果有帮助,我知道代码从数据库中检索信息,当我尝试时它只是在该步骤之后崩溃将它分配给一个变量(不确定当时代码中到底发生了什么,因为当我单步执行它时,它会在从数据库中检索内容后抛出错误)
    • 不确定,但只需仔细检查所有字段名称的大小写并卸载应用程序,清理 Android Studio 并重试。卸载很重要,因为必须刷新 Firebase 本地现金
    • 我在模拟器上运行它,你认为这会导致问题吗?
    【解决方案3】:

    如果所有主构造函数参数都有默认值,Kotlin 也会生成一个无参数构造函数。在您的情况下,DateJoined 缺少一个。所以

    data class User(
            var FirstName: String = "",
            var LastName: String = "",
            var Email: String = "",
            var Password: String = "",
            var DateJoined: ... = ...
    )
    

    (我不知道 FireBase 中的字段允许哪些类型,但 Any 可能不是一种,如果是它就不能有效。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多