Автоматическое удаление вложенных объектов в ORMLite - PullRequest
4 голосов
/ 29 февраля 2012

У меня есть эти классы:

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

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

Теперь строка OpeningTimes создается автоматически, когда я вызываю метод createOrUpdate для StationDao.Это здорово!

Я был бы также благодарен, если бы я мог автоматически удалять объект Station и его вложенный объект OpeningTimes.

Теперь я должен сделать это таким образом в классе Station, и это выглядит довольно странно,Есть ли более элегантный способ?

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

РЕДАКТИРОВАТЬ: Я пытался также это, но с ошибками оператора SQL

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

1 Ответ

9 голосов
/ 29 февраля 2012

Я бы подумал сделать это на уровне DAO, а не на уровне постоянных объектов. Я рекомендую создать собственный интерфейс StationDao и собственную реализацию StationDaoImpl. ORMLite документация пример этого .

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

Затем создайте свою реализацию, которая переопределит метод delete(), и удалите все дочерние объекты. Примерно так:

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

Если вы используете свой собственный DAO, вам необходимо убедиться, что он настроен с использованием @DatabaseTable(daoClass = StationDaoImpl.class).

...