带有 Realm 的 Firebase。反序列化 POJO class
Firebase with Realm. De-serializing POJO class
我的 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 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 class 反序列化(即删除领域),它工作正常。
Firebase 无法与没有 default
构造函数或私有变量的 classes 一起工作,即没有 public getter/setter.
在您的情况下,一个更简单的解决方案是制作一个中间件 class,它与 pojo 相同,只是不扩展 RealmObject。接下来使用 pojo 的值初始化您的 RealmObject subclass。
伪代码
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;
}
RealmList 不是反序列化支持的类型。您的数据库检查其结构并推断轨道应该是一个 ArrayList。然后,当它尝试转换它时,发现类型不匹配。
Check this link from the docs:
此外,让您的对象不可变以避免不必要的访问 and/or 修改是一个很好的做法。
从头开始创建一个空对象,然后调用 setter 方法来定义它的状态不是一个很好的模式,因为它可以创建一个对象在其状态为 [=36 之前被访问的情况=].
如果您需要创建一个灵活的对象,它有一些必填字段和一些可选字段,请考虑使用构建器模式,尽管为此您必须重新设计您的模型。
如果您不need/want使用生成器,我的建议是:
1) 将空构造函数设为私有并创建另一个 public 需要所有字段的构造函数。
2) 将您的曲目字段更改为 "List" 类型。然后,如果您需要 return RealmList 的对象,请创建另一个 getter 方法,例如 tracksAsRealmList() ,它会从成员列表中创建一个 RealmList 并 returns 它。
3) 确保 "Track" 模型有一个空的私有构造函数,一个 public 具有所有参数的构造函数,并且它的所有字段都受 firebase 反序列化支持。
4) 除非绝对必要,否则请将您的对象字段设为私有并通过 setter 方法设置其值。
希望对您有所帮助。
我的 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 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 class 反序列化(即删除领域),它工作正常。
Firebase 无法与没有 default
构造函数或私有变量的 classes 一起工作,即没有 public getter/setter.
在您的情况下,一个更简单的解决方案是制作一个中间件 class,它与 pojo 相同,只是不扩展 RealmObject。接下来使用 pojo 的值初始化您的 RealmObject subclass。
伪代码
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;
}
RealmList 不是反序列化支持的类型。您的数据库检查其结构并推断轨道应该是一个 ArrayList。然后,当它尝试转换它时,发现类型不匹配。
Check this link from the docs:
此外,让您的对象不可变以避免不必要的访问 and/or 修改是一个很好的做法。
从头开始创建一个空对象,然后调用 setter 方法来定义它的状态不是一个很好的模式,因为它可以创建一个对象在其状态为 [=36 之前被访问的情况=].
如果您需要创建一个灵活的对象,它有一些必填字段和一些可选字段,请考虑使用构建器模式,尽管为此您必须重新设计您的模型。
如果您不need/want使用生成器,我的建议是:
1) 将空构造函数设为私有并创建另一个 public 需要所有字段的构造函数。
2) 将您的曲目字段更改为 "List" 类型。然后,如果您需要 return RealmList 的对象,请创建另一个 getter 方法,例如 tracksAsRealmList() ,它会从成员列表中创建一个 RealmList 并 returns 它。
3) 确保 "Track" 模型有一个空的私有构造函数,一个 public 具有所有参数的构造函数,并且它的所有字段都受 firebase 反序列化支持。
4) 除非绝对必要,否则请将您的对象字段设为私有并通过 setter 方法设置其值。
希望对您有所帮助。