我正在使用ORMLite,尝试使用ForeignCollectionKey,但我收到以下错误:
内部DAO对象为null。如果已经反序列化,则无法使用LazyCollections。
我的对象名为Zone:
public class Zone implements Serializable {
private static final long serialVersionUID = 1L;
public static final String ZONE_ID = "id";
public static final String ZONE_PARENT_ID = "parentZoneId";
@DatabaseField(generatedId=true)
private int id;
@DatabaseField()
String name;
@DatabaseField(foreign=true, foreignAutoRefresh = true)
Zone parentZone;
@ForeignCollectionField(foreignFieldName = "parentZone", eager = true)
private ForeignCollection<Zone> zoneChild;
public Zone() {
// TODO Auto-generated constructor stub
}
public ForeignCollection<Zone> getZoneChild() {
return zoneChild;
}
public void setZoneChild(ForeignCollection<Zone> zoneChild) {
this.zoneChild = zoneChild;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
在一个类中,我正在做一个递归方法来获取我的所有区域子对象:
public void getZone(Zone zone, Dao<Zone, Integer> tempZoneDao){
ZoneListEntity zoneEntity = new ZoneListEntity();
zoneEntity.setName(zone.getName());
zoneEntity.setNiveau(0);
zoneEntity.setZone(zone);
mainZoneList.add(zoneEntity);
List<Zone> childList = new ArrayList<Zone>(zone.getZoneChild());
//set rootZone's children as ZoneListEntity
for(Zone currentZone : childList){
ZoneListEntity zoneGroup = new ZoneListEntity();
zoneGroup.setName(currentZone.getName());
zoneGroup.setZone(currentZone);
System.out.println("Zone : "+currentZone.getName());
getZone(currentZone, tempZoneDao);
}
}
当我第一次进入getZone
时,一切顺利。然后当我循环getZone
时,应用程序崩溃尝试访问子区域:
List<Zone> childList = new ArrayList<Zone>(zone.getZoneChild());
你有什么想法吗?我的模型构造对吗? 感谢
答案 0 :(得分:3)
你有什么想法吗?我的模型构造对吗?感谢
因此异常消息试图解释发生了什么。我不确定如何改进它。
内部DAO对象为null。如果已经反序列化,则无法使用LazyCollections。
您正在尝试访问已被反序列化的zoneChild
ForeignCollection
。由于已反序列化,因此无法重新建立所有基础数据库配置和连接。我想当它存储在Android Bundle
中时会发生这种情况?我不确定这是否是唯一的情况。
如果你需要获得Zone
个孩子,你必须在之后在实体上调用dao.refresh()
,然后对其进行反序列化或者通过执行zoneDao
。
答案 1 :(得分:1)
我像Gray建议解决了这个问题:传递Bundle中的主键属性,然后再从目标Activity中的数据库中获取对象:
示例:
假设我想传递一个Person对象,并且我已将Person.name
声明为:
@DatabaseField (columnName ="name")
private String name;
然后:
<强> ActivityA 强>
Intent intent = new Intent(ActivityA.this, ActivityB.class);
Bundle bundle = new Bundle();
bundle.putString("NAME" Person.getName());
intent.putExtras(bundle);
<强> ActivityB 强>
String name = getIntent().getExtras().getString("NAME"));
Person p = getHelper().getPersonDao().queryForEq("name", name);
在那里,你的收藏品将会更新。