我尝试从Firebase登录后检索用户的信息。我怀疑这个错误实际上不是我的问题 - 并且必须处理这样一个事实:我正在使用ServerValue.Timestamp
来存储用户注册时的日期/时间(因为我'我试图把日期赶回来,我的班级不知道该怎么办呢)。我的数据库看起来像这样:
登录时,这是我用来获取用户信息的代码
//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)
是错误被抛出的地方 - 是什么给出了?
答案 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
可能不是一个,如果是,则效率不高。)