我遇到了不同的代码段,关于在SQLiteHelper
中启用外键约束。我想知道,我是否应该在onOpen
或onConfigure
中启用外键约束,如果我想支持API< 16也是。
此讨论表明,在API 16之前,onOpen
是正确的位置:Foreign key constraints in Android using SQLite? on Delete cascade
但是,自API 16起,官方文档确实提到onConfigure
是正确的地方。
public void setForeignKeyConstraintsEnabled (boolean enable)
...
A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback.
对于API 16和< 16?
,我可以知道单一入口点是什么@Override
public void onOpen(SQLiteDatabase database) {
super.onOpen(database);
if (!database.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}
或
// https://stackoverflow.com/questions/13641250/sqlite-delete-cascade-not-working
@SuppressLint("NewApi")
@Override
public void onConfigure(SQLiteDatabase database) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
database.setForeignKeyConstraintsEnabled(true);
} else {
database.execSQL("PRAGMA foreign_keys=ON");
}
}
答案 0 :(得分:9)
onConfigure()
将是理想的,但它仅在API 16及更高版本上调用。如果minSdkVersion
为16或以上,请使用它。
onOpen()
有一个问题,即只有在可能的onCreate()
/ onUpgrade()
等之后调用它。如果您在onCreate()
/ onUpgrade()
中有SQL需要外国要强制执行的密钥,在onOpen()
中设置外键编译指示已经太晚了。对于minSdkVersion < 16
,请考虑以下事项:
始终在onOpen()
。
如果您的onCreate()
/ onUpgrade()
要求强制执行外键,请在那里启用它们。真正使他们可能两次没有任何伤害。