我有一個奇怪的問題,在我的android應用程序,它與外鍵上的數據庫關係有關。下面的代碼說明我的簡單數據庫的結構, 我已經使用SQLiteOpenHelper作爲手柄數據庫操作一個超類從Sqlite數據庫表刪除故障(關係非常行爲)
private static final String CATEGORIES_TABLE = "CREATE TABLE __CATEGORIES_TBL(_id INTEGER PRIMARY KEY AUTOINCREMENT, _name TEXT NOT NULL, _desc TEXT NULL,"
+ "_create_date INTEGER NOT NULL, _update_date INTEGER NULL"
+ ", _parent_id INTEGER NULL, FOREIGN KEY(_parent_id) REFERENCES __CATEGORIES_TBL(_id) ON DELETE RESTRICT);";
private static final String CARDS_TABLE = "CREATE TABLE __CARDS_TBL(_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "_value TEXT NOT NULL, _play_count INTEGER NULL, "
+ "_category_id INTEGER NOT NULL, FOREIGN KEY(_category_id) REFERENCES __CATEGORIES_TBL(_id) ON DELETE RESTRICT);";
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("PRAGMA foreign_keys = ON;");
db.execSQL(CATEGORIES_TABLE);
db.execSQL(CARDS_TABLE);
Logger.i("DB-INIT-DONE!");
} catch (Exception ex) {
Logger.e("Database on create error", ex);
}
}
,你看到的一切似乎是O.K,它是;我可以插入,編輯,從兩個表中選擇行,但不幸的是我可以刪除他們有子行的行。 正如我所料。因爲我使用ON DELETE RESTRICT模式設置了兩個表之間的FK(外鍵)關係,因此我期望在我嘗試從父表中刪除一行時(__CATEGORIES_TBL),實際上父記錄正在刪除並且不會出現異常發生,
理論sqlite必須防止刪除__CATEGORIES_TBL中的任何行__CARDS_TBL中的一個或多個子行或__CATEGORIES_TBL中的任何子行時,但在我的應用程序中,我可以刪除行時,它有一個親子關係行,
考慮下面的代碼(這是刪除代碼)
private SQLiteDatabase db;
public long delete(long objId) {
try {
// TABLE_NAME can be __CATEGORIES_TBL or __CARDS_TBL based on program flow
return db.delete(TABLE_NAME, COLUMN_ROWID + "=" + objId, null);
} catch (Exception e) {
Logger.d("Unable to delete category <" + objId + ">.", e);
return -123456;
}
}
每次調用db.delete都會返回1(表示1行被該命令刪除),這段代碼在android 2.3下執行;
在此先感謝。
你應該可能創建一個觸發器,以避免 –