Firebase 与 Realm.反序列化 POJO 类 [英] Firebase with Realm. De-serializing POJO class

查看:16
本文介绍了Firebase 与 Realm.反序列化 POJO 类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 firebase 数据库中有数据,一切正常,直到我尝试对数据进行反序列化.

I have data in my firebase DB, everything works fine until I try to De-serialize the data.

错误:参数 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 类:

This is my POJO class:

@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 类(即删除领域)进行反序列化,则它可以正常工作.

If I try to de-serialize with Normal POJO class (i.e Removing Realm) it works fine.

推荐答案

Firebase 不适用于没有 default 构造函数或私有变量(即没有公共 getter/setter)的类.

Firebase won't work with classes that do not have default constructor or private variables i.e no public getter/setter.

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

A easier solution in your case would be to make a middleware class that is the same pojo just not extending RealmObject. Next initialise your RealmObject subclass using the values of the pojo.

伪代码

class SimplePojoPlaylist  {
     public String variable;
}

class Playlist extends RealmObject {
     public String variable;
}

然后先转换成SimplePojoPlaylist

    for (DataSnapshot child : dataSnapshot.getChildren()) {
         SimplePojoPlaylist receivedPlaylist = child.getValue(SimplePojoPlaylist.class);
         Playlist playList = new Playlist();
         playList.variable = receivedPlaylist.variable;
    }

这篇关于Firebase 与 Realm.反序列化 POJO 类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆