Firebase"用户缺少一个没有参数的构造函数"

时间:2016-08-06 08:36:15

标签: java android firebase firebase-realtime-database

我正在尝试从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;

任何帮助都会很棒,谢谢

4 个答案:

答案 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=""
)