Удаление с помощью ormlite на Android?

У меня есть клиентский бин,

@DatabaseField(columnName = "client_id",generatedId = true,useGetSet = true)
private Integer clientId;
@DatabaseField(columnName = "client_nom",useGetSet = true)
private String clientNom;
@DatabaseField(columnName = "city_id",foreign = true,useGetSet = true)
private City city;

и городской бин,

@DatabaseField(columnName = "city_id",generatedId = true,useGetSet = true)
private Integer cityId;
@DatabaseField(columnName = "city_name",useGetSet = true)
private String cityName;
@ForeignCollectionField
private ForeignCollection<Client> clientList;

Эти бины являются лишь примером, но, скажем, я хочу удалить всех клиентов, имеющих чужой город cityId при удалении города.

Как это возможно, пожалуйста?

2 ответа

ORMLite не поддерживает каскадное удаление @Majid. Это в настоящее время выходит за рамки того, что он считает "облегченным". Если вы удалите city тогда вам нужно удалить clients рукой.

Одним из способов обеспечения этого было бы иметь CityDao класс, который отменяет delete() метод и выдает удаление через ClientDao в то же время. Что-то вроде:

public class CityDao extends BaseDaoImpl<City, Integer> {
    private ClientDao clientDao;
    public CityDao(ConnectionSource cs, ClientDao clientDao) {
        super(cs, City.class);
        this.clientDao = clientDao;
    }
    ...
    @Override
    public int delete(City city) {
        // first delete the clients that match the city's id
        DeleteBuilder db = clientDao.deleteBuilder();
        db.where().eq("city_id", city.getId());
        clientDao.delete(db.prepare());
        // then call the super to delete the city
        return super.delete(city);
    }
    ...
}

Чтобы реализовать каскадирование при использовании ORMLite на Android, необходимо включить ограничения внешнего ключа, как описано здесь:

(Уровень API> 16)

@Override
public void onOpen(SQLiteDatabase db){
    super.onOpen(db);
    if (!db.isReadOnly()){
        db.setForeignKeyConstraintsEnabled(true);
    }
}

Для уровня API < 16, пожалуйста, прочитайте: Ограничения внешнего ключа в Android с использованием SQLite? Удалить каскад

Затем используйте аннотацию column Definition для определения каскадного удаления. Пример:

@DatabaseField(foreign = true,
columnDefinition = "integer references my_table(id) on delete cascade")
private MyTable table;

Предполагается, что имя таблицы / объекта - "my_table", как описано здесь: Создание ограничений внешнего ключа в ORMLite под SQLite

Другие вопросы по тегам