类缺少一个没有参数的构造函数 - 但我提供了一个构造函数

时间:2017-11-29 22:52:15

标签: android firebase-realtime-database kotlin

我尝试从Firebase登录后检索用户的信息。我怀疑这个错误实际上不是我的问题 - 并且必须处理这样一个事实:我正在使用ServerValue.Timestamp来存储用户注册时的日期/时间(因为我'我试图把日期赶回来,我的班级不知道该怎么办呢)。我的数据库看起来像这样:

enter image description here

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

//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) {}
})

我将User类放在一个单独的文件中:

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)是错误被抛出的地方 - 是什么给出了?

3 个答案:

答案 0 :(得分:1)

查看文档Here

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

所以不幸的是,你不能以这种方式使用数据类。只需将您的课改写为

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table align="center" width="360" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="270" align="right">N1:</td>
    <td width="270" align="right">
      <select name="N1" id="N1">
      <option value="0">0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
     </select>
    </td>
    <td width="270" align="right">N2:</td>
    <td width="270" align="right">
      <select name="N2" id="N2">
      <option value="0">0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
     </select>
    </td>
    <td width="370" align="right">N3:</td>
    <td width="270" align="right">
      <select name="N3" id="N3">
      <option value="0">0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
      </select>
    </td>
  </tr>
</table>

您可能希望使用小写变量名称,因为它是常规。 此外,您可以避免Any for dateJoined,因为我认为它是UTC时间戳。

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

尽管其中一位开发人员曾经说过(这似乎没有出现在文档中),但sdk会尝试访问多种名称样式。这是非常模糊的,所以最好确保匹配数据库密钥。

答案 1 :(得分:0)

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

像:

  

var Password:String =&#34;&#34;,

有资本&#34; P&#34;但是在你的Firebase中,&#34;密码&#34;用小写拼写..

答案 2 :(得分:0)

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

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

(我不知道FireBase中的字段允许哪些类型,但Any可能不是一个,如果是,则效率不高。)