2011-07-22 17 views
18

Mam fasoli Client,Usuwanie za pomocą ormlite na Androida?

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

i fasoli 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; 

Ziarna te są tylko przykładem, ale powiedzmy, że chcesz usunąć wszystkich klientów posiadających jako obce miasto cityId kiedy usuwanie miasta.

Jak to możliwe?

Odpowiedz

52

nie obsługuje usuwania kaskadowania @Majid. To jest obecnie poza tym, co uważa za "lite". Jeśli usuniesz city, musisz ręcznie usunąć clients.

Jednym ze sposobów zapewnienia tego jest posiadanie klasy CityDao, która przesłania metodę delete() i która powoduje usunięcie przez ClientDao w tym samym czasie. Coś jak:

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

Czy możesz podać przykład jak bym instancję CityDao. Na przykład w mojej aplikacji mam "private ArtistDao artistDao = null" i "artistDao = new ArtistDao (Artist.class);". Nie wiem, jak przeprowadzić migrację do niestandardowej klasy rozszerzonej, otrzymuję wyjątki od przesyłania i nie wiem, jak i gdzie podać źródło połączenia. –

+0

Nie rozumiem @SpeedDemon. Twój 'ArtistDao' musi być konkretną klasą, jeśli ją stworzysz. 'CityDao' w moim poście pokazuje, jak rozszerzyć' BaseDaoImpl'. – Gray

+0

Zgaduję, że Twój konstruktor musi rzucić wyjątek SQLException – Piotr

4

celu realizacji kaskadowy podczas korzystania ORMLite na Androida musisz włączyć główne ograniczenia zagranicznych, jak opisano tutaj:

(API poziom> 16)

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

Na poziomie API < 16 przeczytaj: Foreign key constraints in Android using SQLite? on Delete cascade

Następnie użyj adnotacji columnDefinition, aby zdefiniować kaskadowe usuwanie s. Ex:

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

to przy założeniu, że nazwa tabeli/przedmiot jest „my_table”, jak opisano tutaj: Creating foreign key constraints in ORMLite under SQLite

Powiązane problemy