我应该在onOpen或onConfigure中启用外键约束

Che*_*eng 4 sqlite android

我遇到了不同的代码片段,关于启用外键约束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)

laa*_*lto 9

onConfigure()将是理想的,但它只在API 16及更高版本上调用.如果您minSdkVersion的年满16岁或以上,请使用它.

onOpen()有一个问题,它只在可能onCreate()/ onUpgrade()等之后被调用.如果你在onCreate()/ onUpgrade()中需要外键的SQL ,那么设置外键pragma就太晚了onOpen().对于minSdkVersion < 16,请考虑以下事项:

  • 始终启用外键onOpen().

  • 如果您onCreate()/ onUpgrade()要求强制执行外键,也可以在那里启用它们.真正使他们可能两次没有任何伤害.