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

时间:2014-04-01 16:09:52

标签: android sqlite

我遇到了不同的代码段,关于在SQLiteHelper中启用外键约束。我想知道,我是否应该在onOpenonConfigure中启用外键约束,如果我想支持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");
    }
}

1 个答案:

答案 0 :(得分:9)

onConfigure()将是理想的,但它仅在API 16及更高版本上调用。如果minSdkVersion为16或以上,请使用它。

onOpen()有一个问题,即只有在可能的onCreate() / onUpgrade()等之后调用它。如果您在onCreate() / onUpgrade()中有SQL需要外国要强制执行的密钥,在onOpen()中设置外键编译指示已经太晚了。对于minSdkVersion < 16,请考虑以下事项:

  • 始终在onOpen()

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