Android 火基与王国。反序列化POJO类

Android 火基与王国。反序列化POJO类,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的firebase数据库中有数据,在我尝试反序列化数据之前,一切正常 错误:参数1的类型为io.realm.RealmList,获取了java.util.ArrayList 这是我的密码: DatabaseReference root = FirebaseDatabase.getInstance(). getReferenceFromUrl("https://swing-8792d.firebaseio.com/playlist"); Quer

我的firebase数据库中有数据,在我尝试反序列化数据之前,一切正常

错误:参数1的类型为io.realm.RealmList,获取了java.util.ArrayList

这是我的密码:

 DatabaseReference root = FirebaseDatabase.getInstance().
                getReferenceFromUrl("https://swing-8792d.firebaseio.com/playlist");
        Query playlistQuery = root.orderByKey().equalTo(key);
        playlistQuery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {

                    Log.d("Child", child + "");

                    Playlist receivedPlaylist = child.getValue(Playlist.class);
                    Playlist playlist = new Playlist();

                    playlist.setCreatedBy(receivedPlaylist.getCreatedBy());
                    playlist.setName(receivedPlaylist.getName());
                    playlist.setMyMap(receivedPlaylist.getMyMap());
                    playlist.setQrKey(receivedPlaylist.getQrKey());
                    playlist.setCount(receivedPlaylist.getCount());
                    playlist.setId(receivedPlaylist.getId());
                    playlist.setTracks(receivedPlaylist.getTracks());
                    mPlaylist.add(playlist);
 }
这是我的POJO课程:

@RealmClass
public class Playlist extends RealmObject {

String name;
Long id;
RealmList<Track> tracks;
Integer count;
String createdBy;
RealmList<UserMap> myMap;
String qrKey;

public RealmList<UserMap> getMyMap() {
    return myMap;
}

public void setMyMap(RealmList<UserMap> myMap) {
    this.myMap = myMap;
}

public Playlist(){}



public String getQrKey() {
    return qrKey;
}

public void setQrKey(String qrKey) {
    this.qrKey = qrKey;
}

public String getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(String createdBy) {
    this.createdBy = createdBy;
}


public RealmList<Track> getTracks() {
    return tracks;
}

public void setTracks(RealmList<Track> tracks) {
    this.tracks = tracks;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Integer getCount() {
    return count;
}

public void setCount(Integer count) {
    this.count = count;
}
}


如果我尝试用普通的POJO类反序列化,即删除域,则效果很好。

Firebase无法处理没有默认构造函数或私有变量(即没有公共getter/setter)的类

在您的情况下,一个更简单的解决方案是创建一个与pojo相同的中间件类,只是不扩展RealmObject。接下来,使用pojo的值初始化RealmObject子类

伪码

class SimplePojoPlaylist  {
     public String variable;
}

class Playlist extends RealmObject {
     public String variable;
}
然后首先将其转换为SimplePojoPlaylist


Firebase不会处理没有默认构造函数或私有变量(即没有公共getter/setter)的类

在您的情况下,一个更简单的解决方案是创建一个与pojo相同的中间件类,只是不扩展RealmObject。接下来,使用pojo的值初始化RealmObject子类

伪码

class SimplePojoPlaylist  {
     public String variable;
}

class Playlist extends RealmObject {
     public String variable;
}
然后首先将其转换为SimplePojoPlaylist


RealmList不是反序列化支持的类型。您的数据库检查其结构并推断轨迹应该是ArrayList。然后,当它试图转换它时,它发现类型不匹配

另外,使对象不可变以避免不必要的访问和/或修改也是一种很好的做法

从头开始创建一个空对象,然后调用setter方法来定义其状态不是一个很好的模式,因为它可以创建一种情况,即对象在其状态被破坏之前被访问

如果你需要创建一个灵活的对象,有一些必填字段和一些可选的,考虑使用Builder模式,尽管要做它,但是你必须重新设计你的模型。 如果您不需要/不想使用生成器,我的建议是:

1将空构造函数设为私有,并创建另一个需要所有字段的公共构造函数

2将轨迹字段更改为列表类型。然后,如果需要该对象返回RealmList,请创建另一个getter方法,例如tracksAsRealmList,它从成员列表中生成RealmList并返回它

3确保Track模型有一个空的私有构造函数,一个带有所有参数的公共构造函数,并且firebase反序列化支持它的所有字段

4除非严格必要,否则将对象字段设置为私有,并通过setter方法设置其值


我希望这对您有所帮助。

RealmList不是反序列化支持的类型。您的数据库检查其结构并推断轨迹应该是ArrayList。然后,当它试图转换它时,它发现类型不匹配

另外,使对象不可变以避免不必要的访问和/或修改也是一种很好的做法

从头开始创建一个空对象,然后调用setter方法来定义其状态不是一个很好的模式,因为它可以创建一种情况,即对象在其状态被破坏之前被访问

如果你需要创建一个灵活的对象,有一些必填字段和一些可选的,考虑使用Builder模式,尽管要做它,但是你必须重新设计你的模型。 如果您不需要/不想使用生成器,我的建议是:

1将空构造函数设为私有,并创建另一个需要所有字段的公共构造函数

2将轨迹字段更改为列表类型。然后,如果需要该对象返回RealmList,请创建另一个getter方法,例如tracksAsRealmList,它从成员列表中生成RealmList并返回它

3确保Track模型有一个空的私有构造函数,一个带有所有参数的公共构造函数,并且firebase反序列化支持它的所有字段

4除非严格必要,否则将对象字段设置为私有,并通过setter方法设置其值


我希望这对您有所帮助。

我是否要删除我的getter和setter?您可以保留它们。我没有用它们来保持答案的简短。一个问题是我的播放列表有RealmList,但SimplePojoList将有Arraylist,我如何处理这个领域。beginTransaction;OtherObject.getList.addAlllist;realm.commitTransaction;getList从何而来?我是否删除了我的getter和setter?您可以保留它们。我没有用它们来保持答案的简短。一个问题是我的播放列表有RealmList,但SimplePojoList将有Arraylist,我如何处理这个领域。beginTransaction;OtherObject.getList.addAlllist;realm.commitTransaction;getList来自哪里?