android - SQLite删除级联不起作用

标签 android sqlite cascading-deletes

在Android 4.2中,使用SQLite 3.7.11,当我从Quizzes表中删除一行时,谁的架构在下面,QuizQuestions表中的相应行不会被删除。

我不知道出了什么问题。我试过把

db.execSQL("PRAGMA foreign_keys = ON;"); 

在创建表语句之前和之后。

创建表语句:

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);

最佳答案

您的数据库应该从 quizQuestions 中删除行,以防有人从 quizzesquestions 中删除行。如果关闭了外键支持并且您只有可以包含任何值的常规列,它将忽略 整个 外键约束。

每次您打开数据库时,SQLite 默认为 PRAGMA foreign_keys = OFF。它不是表或模式的属性。

如果你使用 SQLiteOpenHelper 把它放在 onOpen 中。那是每次打开数据库时调用的地方。 onCreate 只在数据库创建时执行一次。


当你第一次调用 getWriteableDatabaseSQLiteOpenHelper 调用的是什么

  1. onConfigure 每次,API Level >= 16 要求
  2. 根据数据库文件的存在和版本,在事务中调用以下内容
    • onCreate 如果没有数据库文件。通常,这只会在应用的整个生命周期中发生一次。
    • onUpgrade 如果数据库版本(PRAGMA user_version - 保存在数据库文件中)低于 SQLiteOpenHelper 构造函数中提供的版本。每次您在代码中修改版本时都会发生这种情况。
    • 如果文件存在且版本匹配,则无。
  3. onOpen 每次

如果 SQLiteOpenHelper 的同一个实例已经有一个打开的数据库,它只会返回它,并且不会发生上述任何事情。

关于android - SQLite删除级联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13641250/

相关文章:

android - 继承自 Theme.AppCompat*

android - 如何在 kml url 中为 Google Map 中的路径传递源和目的地纬度和经度之间的航路点?

php - 在删除级联时 - 我必须在其中添加它

sql - 在 SQL 中创建查询时需要一些帮助吗?

sql - 使用 SQLite 从两列中获取唯一的对称对

java - Hibernate:级联保存时一对多关系但不删除

java - 你如何使用谷歌云平台?

android - float 操作按钮扩展

sqlite - savePoint 无效,应该是调用 SaveTransactionPoint 的结果

android - 带有 AsyncTask 和 SQLite 游标的 NullPointerException