我正在尝试从Firebase中的/ User / tree中检索我的用户详细信息。我有以下用户对象:
public class User {
private String name;
private String email;
private FirebaseUser firebaseUser;
private String lastOnline;
private LatLng latLng;
private ArrayList<SwapLocation> locations;
public User(){ }
public String getName(){
if(firebaseUser.getDisplayName() != null && !firebaseUser.getDisplayName().equals(""))
return firebaseUser.getDisplayName();
if(name != null && !name.equals(""))
return name;
return "";
}
public void setName(String name){
this.name = name;
}
public String getEmail(){
if(firebaseUser.getEmail() != null && firebaseUser.getEmail().equals(""))
return firebaseUser.getEmail();
if(email != null && email.equals(""))
return email;
return "";
}
public void setEmail(String email){
this.email = email;
}
public void setFirebaseUser(FirebaseUser firebaseUser){
this.firebaseUser = firebaseUser;
}
public FirebaseUser getFirebaseUser(){
return firebaseUser;
}
public void setLastOnline(String lastOnline){
this.lastOnline = lastOnline;
}
public String getLastOnline(){
if(lastOnline != null)
return lastOnline;
return "";
}
public void setLatLong(LatLng latlng){
this.latLng = latlng;
}
public LatLng getLatLong(){
return this.latLng;
}
public ArrayList<SwapLocation> getLocations(){
return locations;
}
public void setLocations(ArrayList<SwapLocation> locations){
this.locations = locations;
}
}
我正在尝试从Firebase中检索此对象。该对象在dataSnapshot中被检索,尽管它在序列化到我的User对象时出现问题。
这是我从Firebase检索对象的方式:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(users_group).child(user.getUid());
ref.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User this_user = dataSnapshot.getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
但是当尝试做“用户this_user = dataSnapshot.getValue(User.class)&#39;我得到一个错误说&#34;用户缺少一个没有参数的构造函数&#34;
任何帮助都会很棒,谢谢
答案 0 :(得分:32)
您必须收到此错误,因为您的User类是一个子类。
将您的班级标记为静态:
public class SomeParentClass{
public static class User {
....
}
}
或在单独的文件中创建。
答案 1 :(得分:11)
我已经在 kotlin 中使用firebase实时数据库解决了这个问题,并通过this solution
解决了这个问题对于Kotlin,如果您将以下数据类用于Firebase,
data class UserModel(
var UserName: String,
var UserType: Int
)
那么你会得到一个类似的错误
com.google.firebase.database.DatabaseException:UserModel不 定义一个无参数的构造函数。如果您使用的是ProGuard,请确保 这些构造函数不会被剥离。
因此,您需要初始化其值。
data class UserModel(
var UserName: String = "",
var UserType: Int = 0
)
答案 2 :(得分:3)
用户没有参数错误意味着即使您确实需要一个空的构造函数:
public User(){ }
您还将需要另一个构造器,该构造器的对象内部是Firebase对象中的子变量。例如:
public User(
String name,
String email,
FirebaseUser firebaseUser,
String lastOnline,
LatLng latLng,
ArrayList<SwapLocation> locations
){
this.name = name;
this.email = email;
this.firebaseUser = firebaseUser;
this.lastOnline = lastOnline;
this.latLong = latLong;
this.locations = locations;
}
还要注意诸如SwapLocation
之类的构造函数内部的类,如果它不能自动解析,则需要以相同的方式进行修改。
另一方面,在Kotlin中,您不应使用空值实例化,而应使用null实例化,并在顶部添加@IgnoreExtraProperties
和@Keep
以仅在数据中存在属性时才加载属性。例如:
@Keep
@IgnoreExtraProperties
open class User(
var name : String? = null,
var email : String? = null,
var firebaseUser : FirebaseUser? = null,
var lastOnline : String? = null,
var latLng : LatLng? = null,
var locations : ArrayList<SwapLocation>? = null
)
希望有帮助!
答案 3 :(得分:1)
在kotlin中,需要初始化数据类构造函数变量来诊断此错误。
data class Images(val imageOne:String="",
val imageTwo:String="",
val imageThree:String=""
)