ORMLite:内部DAO对象为null

时间:2013-12-17 09:08:47

标签: java android foreign-key-relationship ormlite

我正在使用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());

你有什么想法吗?我的模型构造对吗? 感谢

2 个答案:

答案 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);

在那里,你的收藏品将会更新。