我遇到了不同的代码片段,关于启用外键约束SQLiteHelper.我在想,我应该启用外键约束onOpen或者onConfigure,如果我想支持API <16为好.
onOpen在API 16之前,这个讨论建议是正确的地方:使用SQLite的Android中的外键约束?在删除级联
但是,自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.
Run Code Online (Sandbox Code Playgroud)
我可以知道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;");
}
}
Run Code Online (Sandbox Code Playgroud)
要么
// 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");
}
}
Run Code Online (Sandbox Code Playgroud)
onConfigure()将是理想的,但它只在API 16及更高版本上调用.如果您minSdkVersion的年满16岁或以上,请使用它.
onOpen()有一个问题,它只在可能onCreate()/ onUpgrade()等之后被调用.如果你在onCreate()/ onUpgrade()中需要外键的SQL ,那么设置外键pragma就太晚了onOpen().对于minSdkVersion < 16,请考虑以下事项:
始终启用外键onOpen().
如果您onCreate()/ onUpgrade()要求强制执行外键,也可以在那里启用它们.真正使他们可能两次没有任何伤害.
| 归档时间: |
|
| 查看次数: |
2896 次 |
| 最近记录: |