Dan*_*021 33 sqlite android cascading-deletes
在Android 4.2中,使用SQLite 3.7.11,当我从Quizzes表中删除一行时,下面是谁的模式,QuizQuestions表中的相应行不会被删除.
我无法弄清楚出了什么问题.我试过推杆
db.execSQL("PRAGMA foreign_keys = ON;");
Run Code Online (Sandbox Code Playgroud)
create table语句之前和之后.
创建表语句:
CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE);
CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER,
PRIMARY KEY(quiz_name, question_id),
FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE,
FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE);
Run Code Online (Sandbox Code Playgroud)
zap*_*apl 66
您的数据库应删除行quizQuestions,以防有人从中删除quizzes或从中删除questions.如果关闭外键支持并且您只有包含任何值的常规列,它将忽略整个外键约束.
SQLite默认为PRAGMA foreign_keys = OFF每次打开数据库.它不是表或模式的属性.
万一你使用SQLiteOpenHelper它onOpen.这是每次打开数据库时调用的地方.onCreate创建数据库时只有一次.
什么SQLiteOpenHelper,当你调用调用getWriteableDatabase首次为
onConfigure 每次都需要API级别> = 16onCreate如果没有数据库文件.通常,这仅在应用程序的整个生命周期中发生一次.onUpgrade如果数据库版本(PRAGMA user_version- 保存在数据库文件中)小于SQLiteOpenHelper构造函数中提供的版本.每次碰到代码中的版本时都会发生错误.onOpen 每次如果SQLiteOpenHelper已经有一个打开的数据库的同一个实例,它将只返回它,并且上面没有发生任何事情.
mvp*_*mvp 23
尝试在Android应用中打开数据库后立即添加:
db.execSQL("PRAGMA foreign_keys=ON");
Run Code Online (Sandbox Code Playgroud)
这打开了对外键的支持,这是ON DELETE CASCADE正常工作所必需的.
Sqlite默认禁用外键约束,所以你需要通过简单地覆盖DBhelper类中的onOpen方法来启用它,如下所示
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21854 次 |
| 最近记录: |