2011-07-22 12 views
18

私はアンドロイドでormliteを使用して削除しますか?

@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として私が持つすべてのクライアントを削除する、のは言わせ、

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

と市豆、クライアントBeanを持っています都市を削除する。

どうすればよいですか?

答えて

52

ORMLite @Majidのカスケード削除はサポートされていません。それは現在、「軽い」とみなされているものの外にあります。 cityを削除すると、手でclientsを削除する必要があります。

これを確実にする1つの方法は、delete()メソッドをオーバーライドしてClientDaoで削除を発行するCityDaoクラスを持つことです。 Android上でORMLiteを使用しながら、カスケードを実装するために

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

あなたは私がCityDaoをインスタンス化する方法の例をお願いできます。たとえば、私のアプリで私は "私のArtistDao artistDao = null"と "artistDao =新しいArtistDao(Artist.class);"。カスタム拡張クラスに移行する方法がわからないので、キャスト例外が発生し、接続ソースをどのように、どこに提供するのか分かりません。 –

+0

@SpeedDemonを理解できません。あなたがそれをインスタンス化するなら、あなたの 'ArtistDao'は具象クラスでなければなりません。私のポストの 'CityDao'は' BaseDaoImpl'を拡張する方法を示しています。 – Gray

+0

あなたのコンストラクタはSQLExceptionをスローする必要があります – Piotr

4

あなたはここで説明するように、外部キー制約を有効にする必要があります:ような何かAPIレベル<については

(APIレベル> 16)

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

16をお読みください。 Foreign key constraints in Android using SQLite? on Delete cascade

次に、columnDefinitionアノテーションを使用してカスケード削除を定義してくださいs。例:

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

これは、ここで説明するように、テーブル/オブジェクト名が、「MY_TABLE」であると想定されます。Creating foreign key constraints in ORMLite under SQLite