Удаление с помощью ormlite на Android?
У меня есть клиент bean,
@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;
и City bean,
@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;
Те beans являются всего лишь примером, но, допустим, я хочу удалить всех клиентов, имеющих чужой город cityId при удалении города.
Как это возможно?
Ответы
Ответ 1
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 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);
}
...
}
Ответ 2
Для реализации каскадирования при использовании ORMLite на Android вам необходимо включить ограничения внешнего ключа, как описано здесь:
(уровень API > 16)
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
if (!db.isReadOnly()){
db.setForeignKeyConstraintsEnabled(true);
}
}
Для уровня API < 16, пожалуйста, прочтите:
Ограничения внешнего ключа в Android с помощью SQLite? on Удалить каскад
Затем используйте аннотацию columnDefinition для определения каскадных удалений. Пример:
@DatabaseField(foreign = true,
columnDefinition = "integer references my_table(id) on delete cascade")
private MyTable table;
Предполагается, что имя таблицы/объекта является "my_table", как описано здесь: Создание ограничений внешнего ключа в ORMLite в SQLite