2011-07-22 7 views
18

tengo un grano de cliente,¿Eliminar usando ormlite en 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; 

y un grano 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; 

Esos granos son sólo un ejemplo, pero digamos, quiero borrar todos los clientes que tengan por ciudad extranjera CityId cuando eliminando una ciudad.

¿Cómo es posible?

Respuesta

52

ORMLite no es compatible con las eliminaciones en cascada @Majid. Eso está actualmente fuera de lo que considera "lite". Si borras el city, entonces debes borrar el clients a mano.

Una forma de garantizar esto sería tener una clase CityDao que anule el método delete() y emita la eliminación a través del ClientDao al mismo tiempo. Algo así 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); 
    } 
    ... 
} 
+1

Puede por favor dar un ejemplo de cómo iba a crear una instancia CityDao. Por ejemplo, en mi aplicación, tengo "artista ArtistDao privado, Quiz = null" y "artistDao = new ArtistDao (Artist.class);". No sé cómo migrar a una clase extendida personalizada, obtengo excepciones y no sé cómo ni dónde proporcionar la fuente de conexión. –

+0

No entiendo @SpeedDemon. Tu 'ArtistDao' debe ser una clase concreta si lo creas. El 'CityDao' en mi publicación muestra cómo extender' BaseDaoImpl'. – Gray

+0

Supongo que su constructor tiene que lanzar SQLException – Piotr

4

Para implementar en cascada durante el uso de ORMLite en Android necesita habilitar las restricciones de clave externa como se describe aquí:

(API nivel de> 16)

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

Para el nivel API < 16 por favor lea: Foreign key constraints in Android using SQLite? on Delete cascade

A continuación, utilice la anotación columnDefinition para definir la eliminación en cascada s. Ej:

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

Esto es asumiendo el nombre de tabla/objeto es "mi_tabla", tal como se describe aquí: Creating foreign key constraints in ORMLite under SQLite

Cuestiones relacionadas