¿Eliminar usando ormlite en Android?
foreign-collection (2)
Tengo un bean cliente
@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;
y un frijol de la ciudad,
@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;
Esos frijoles son solo un ejemplo, pero digamos, quiero eliminar a todos los clientes que tengan como ciudad extranjera ciudad al borrar una ciudad.
¿Cómo es posible por favor?
Para implementar la conexión en cascada mientras usa ORMLite en Android, debe habilitar las restricciones de clave externa como se describe aquí:
(Nivel API> 16)
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
if (!db.isReadOnly()){
db.setForeignKeyConstraintsEnabled(true);
}
}
Para el nivel de API <16, lea: ¿ Restricciones de clave externa en Android con SQLite? en Eliminar cascada
Luego use la anotación columnDefinition para definir eliminaciones en cascada. Ex:
@DatabaseField(foreign = true,
columnDefinition = "integer references my_table(id) on delete cascade")
private MyTable table;
Esto se supone que el nombre de la tabla / objeto es "my_table", como se describe aquí: Creación de restricciones de clave foránea en ORMLite en SQLite
ORMLite no admite eliminaciones en cascada @Majid. Eso está actualmente fuera de lo que considera ser "lite". Si elimina la city
entonces necesita eliminar los clients
a mano.
Una forma de asegurar esto sería tener una clase CityDao
que anule el método delete()
y emita la eliminación a través de ClientDao
al mismo tiempo. Algo como:
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);
}
...
}