2013-12-17 4 views
2

Я использую ORMLite, пытаясь использовать ForeignCollectionKey, но я получил следующее сообщение об ошибке:ORMLite: Внутренний объект DAO является нулевым

Внутренний объект DAO является нулевым. LazyCollections нельзя использовать, если они были десериализованы.

Я мой объект с именем зоны:

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()); 

У вас есть какие-нибудь идеи? Является ли моя модель правильной? Thanks

ответ

3

Есть ли у вас идеи? Является ли моя модель правильной? Спасибо

Так сообщение об исключении пытается объяснить, что происходит. Я не уверен, как это можно улучшить.

Внутренний объект DAO имеет значение NULL. LazyCollections нельзя использовать, если они были десериализованы.

Вы пытаетесь получить доступ к zoneChild, который является ForeignCollection, который был удален из десерта. Поскольку он был десериализован, все базовые конфигурации и соединения базы данных не могут быть восстановлены. Я думаю, это может произойти, когда он хранится в Android Bundle? Я не уверен, что это единственный случай.

Если вам нужно, чтобы получить Zone детей вы собираетесь иметь либо вызвать dao.refresh() на предприятие после десериализации его или сделать запрос самостоятельно, выполнив zoneDao.

+0

уже пробовал обновление, но не работал ... Я изменил модель своей базы данных, она работает лучше, но без самостоятельной работы. – Max

+0

Помогает ли этот вопрос @Max? http://stackoverflow.com/questions/20802976/how-can-i-fill-the-foreign-collection-manually/20907285#20907285 – Gray

+0

Вызов refresh * does * действительно работает, назовите его на объект, который у вас есть foreignCollection от объекта, который вы отправили через Extras – Odaym

1

Я решил эту проблему, как Грей предложил: передать атрибут первичного ключа в Bundle, а затем получить объект снова из базы данных в целевой деятельности:

Пример:

Давайте предположим, что я хочу передать объект 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); 

И вы, ваша коллекция будет обновляться.

Смежные вопросы