Подтвердить что ты не робот

Удаление с помощью 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 при удалении города.

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

4b9b3361

Ответ 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