Удаление с помощью ормлайта на 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;

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

Как такое возможно?


person Majid    schedule 22.07.2011    source источник


Ответы (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);
    }
    ...
}
person Gray    schedule 22.07.2011
comment
Не могли бы вы привести пример того, как я могу создать экземпляр CityDao. Например, в моем приложении есть личные ArtistDao artistDao = null и artistDao = new ArtistDao (Artist.class) ;. Я не знаю, как перейти на настраиваемый расширенный класс, я получаю исключения при приведении, и я не знаю, как и где предоставить источник подключения. - person Speed Demon; 27.02.2014
comment
Я не понимаю @SpeedDemon. Ваш ArtistDao должен быть конкретным классом, если вы его создаете. CityDao в моем сообщении показывает, как расширить BaseDaoImpl. - person Gray; 27.02.2014
comment
Я предполагаю, что ваш конструктор должен выбросить SQLException - person Piotr; 08.07.2014

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

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

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

Для уровня API ‹16 прочтите: Ограничения внешнего ключа в Android с помощью SQLite? при удалении каскада

Затем используйте аннотацию columnDefinition для определения каскадных удалений. Бывший:

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

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

person Benjamin Carroll    schedule 29.10.2014