Удаление с помощью ormlite на Android? - PullRequest
18 голосов
/ 22 июля 2011

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

@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 ]

52 голосов
/ 22 июля 2011

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);
    }
    ...
}
4 голосов
/ 29 октября 2014

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

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

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

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

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

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

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

...