2012-02-28 3 views
4

Je ces aux classes:Auto supprimer des objets imbriqués dans ORMLite

public class Station { 
    @DatabaseField(foreign = true, foreignAutoCreate = true) 
    private OpeningTimes openingTimes; 
} 

public class OpeningTimes { 
    @DatabaseField(generatedId = true) 
    int _id; 
} 

Maintenant ligne est auto Heures d'ouverture créée, quand je l'appelle méthode createOrUpdate sur StationDao. C'est génial!

Je serais également reconnaissant, si je pouvais supprimer l'objet Station et son objet imbriqué OpeningTimes automatiquement.

Maintenant, je dois le faire de cette façon dans la classe Station et il semble assez déroutant. Y a-t-il une manière plus élégante?

public void deleteFromDb(DatabaseHelper dbHelper) { 
    try { 
     openingTimes.deleteFromDb(dbHelper); 
     dbHelper.getStationDao().delete(this); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

EDIT: J'ai essayé aussi, mais avec des erreurs Déclaration SQL

@DatabaseField(foreign = true, foreignAutoCreate = true, columnDefinition="INTEGER, FOREIGN KEY(`openingTimes_id`) REFERENCES openingtimes(`_id`)") 

Répondre

8

j'envisager de le faire au niveau OAC au lieu d'au niveau de l'objet persistait. Ce que je recommande est de créer votre propre interface StationDao et votre propre implémentation StationDaoImpl. Le ORMLite décrit un example of this.

public interface StationDao extends Dao<Station, Integer> { 
    // we will just be overriding some of the delete methods 
} 

Ensuite, créez votre implémentation qui remplacerait la méthode delete() et supprimer tous les objets enfants. Quelque chose comme ce qui suit:

public class StationDaoImpl extends BaseDaoImpl<Station, Integer> 
    implements StationDao { 
    private final Dao<OpeningTimes, Integer> openTimesDao; 
    public AccountDaoImpl(ConnectionSource connectionSource) throws SQLException { 
     super(connectionSource, Station.class); 
     openTimesDao = DaoManager.createDao(connectionSource, OpeningTimes.class); 
    } 

    @Override 
    public int delete(Station station) throws SQLException { 
     if (station.openTimes != null) { 
      openTimesDao.delete(station.openTimes); 
     } 
     return super.delete(station); 
    } 
} 

Si vous utilisez votre propre OAC alors vous devez vous assurer qu'il est configuré à l'aide @DatabaseTable(daoClass = StationDaoImpl.class).

+2

Cela fonctionnerait-il encore avec 'PreparedDelete'? parce que je voudrais utiliser 'DELETE ID NOT IN' pour faire une synchronisation complète avec une base de données distante. – dzeikei