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

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

在这里输入图像说明

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

 //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)是哪里错误被抛出 – 什么给?

看看这里的文档

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

所以不幸的是你不能用这种方式使用数据类。 只要重写你的课程

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

您可能需要使用小写variables名称,因为这是惯例。 此外,你可以避免任何dateJoined,因为我认为它是一个UTC时间戳。

如果存在该名称的setter / public字段,则firebase sdk将检查每个数据库密钥,如果存在,请设置它。 Kotlin自动生成setter和getters,所以你只需要确保成员的名字与数据库中的键相同。

即使其中一位开发者曾经说过(这似乎并没有出现在文档中),SDK将尝试访问多种命名风格。 这是相当模糊的,所以最好确保匹配数据库键。

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

喜欢:

var Password:String =“”,

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

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

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

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