【发布时间】:2019-08-27 12:47:56
【问题描述】:
在尝试删除作为外键引用的行时(出于实验目的),我遇到了运行时异常。我知道我试图违反外键约束,我只是对 logcat 消息感到困惑,因为它指的是我代码的完全不同的部分。
这是我的SQLiteOpenHelper 的onCreate 方法:
@Override
public void onCreate(SQLiteDatabase db) {
this.db = db;
final String SQL_CREATE_CATEGORIES_TABLE = "CREATE TABLE " +
CategoriesTable.TABLE_NAME + "( " +
CategoriesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
CategoriesTable.COLUMN_NAME + " TEXT " +
")";
final String SQL_CREATE_QUESTIONS_TABLE = "CREATE TABLE " +
QuestionsTable.TABLE_NAME + " ( " +
QuestionsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
QuestionsTable.COLUMN_QUESTION + " TEXT, " +
QuestionsTable.COLUMN_OPTION1 + " TEXT, " +
QuestionsTable.COLUMN_OPTION2 + " TEXT, " +
QuestionsTable.COLUMN_OPTION3 + " TEXT, " +
QuestionsTable.COLUMN_ANSWER_NR + " INTEGER, " +
QuestionsTable.COLUMN_DIFFICULTY + " TEXT, " +
QuestionsTable.COLUMN_CATEGORY + " INTEGER, " +
"FOREIGN KEY(" + QuestionsTable.COLUMN_CATEGORY + ") REFERENCES " +
CategoriesTable.TABLE_NAME + "(" + QuestionsTable._ID + ")" +
")";
db.execSQL(SQL_CREATE_CATEGORIES_TABLE);
db.execSQL(SQL_CREATE_QUESTIONS_TABLE);
fillCategoriesTable();
fillQuestionsTable();
}
这里我用最初的问题填充表格,然后我尝试从类别表中删除一行,故意违反外键约束(测试它):
private void fillQuestionsTable() {
Question q1 = new Question("Easy: A is correct",
"A", "B", "C", 1, Question.DIFFICULTY_EASY, 1);
addQuestion(q1);
Question q2 = new Question("Medium: B is correct",
"A", "B", "C", 2, Question.DIFFICULTY_MEDIUM, 2);
addQuestion(q2);
Question q3 = new Question("Medium: C is correct",
"A", "B", "C", 3, Question.DIFFICULTY_MEDIUM, 3);
addQuestion(q3);
Question q4 = new Question("Hard: A is correct",
"A", "B", "C", 1, Question.DIFFICULTY_HARD, 4);
addQuestion(q4);
Question q5 = new Question("Hard: B is correct",
"A", "B", "C", 2, Question.DIFFICULTY_HARD, 5);
addQuestion(q5);
Question q6 = new Question("Hard: C is correct",
"A", "B", "C", 3, Question.DIFFICULTY_HARD, 6);
addQuestion(q6);
db.execSQL("DELETE FROM " + CategoriesTable.TABLE_NAME + " WHERE ID = 1");
}
我得到一个运行时异常。 请注意,我故意尝试违反外键约束,只是想了解异常。
我的第一个问题是:
1)crash是因为删了,但是为什么logcat只说加4,5和6类的题(我的categories表里本来就没有)?
插入错误难度=Hard option1=A 问题=Hard: C 正确 category_id=6 answer_nr=3 option3=C option2=B android.database.sqlite.SQLiteConstraintException: FOREIGN KEY 约束失败(代码 787)
为什么它没有像我期望的那样谈论删除引用的列?
2) 为什么它会抛出运行时异常,而尝试添加一个类别表中不存在的类别的问题,只是忽略 SQLite 命令,但不会使应用程序崩溃? 通过尝试删除引用的列而违反外键约束时,运行时异常是否是预期行为?
【问题讨论】:
标签: android sqlite android-sqlite sqliteopenhelper