我的 android 应用程序中有一个奇怪的问题,它与外键上的数据库关系有关。以下代码描述了我的简单数据库结构,我使用 SQLiteOpenHelper 作为处理数据库操作的超类
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);
}
}
如您所见,一切似乎都很好,而且确实如此;我可以在两个表中插入、编辑、选择行,但不幸的是我可以删除它们具有子行的行。正如我所料。因为我使用 ON DELETE RESTRICT 模式设置了两个表之间的 FK(外键)关系,因此当我尝试从父表 (__CATEGORIES_TBL) 中删除一行时,我希望得到一个异常,实际上父记录正在删除并且没有异常发生,
从理论上讲,当sqlite在__CARDS_TBL中有一个或多个子行或在__CATEGORIES_TBL中有任何子行时,sqlite必须防止删除__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 下执行;
提前致谢。