gpt4 book ai didi

Android 2.2 + SQLite + 定义参照完整性约束

转载 作者:行者123 更新时间:2023-11-29 02:06:56 25 4
gpt4 key购买 nike

我正在开发一个支持 SQLite 数据库的 Android 2.2+ 应用程序。我试图在创建表时定义参照完整性约束。我还通过在 onCreateonOpen 方法中执行 db.execSQL( "PRAGMA foreign_keys=ON;"); 来启用外键支持SQLiteOpenHelper。在设置我的表和适当的外键引用后,它仍然允许我在缺少引用记录的表中插入行。例如我有以下结构

CREATE TABLE Questions(_id integer primary key,question text not null);
CREATE TABLE Ques_Ans(_id integer primary key autoincrement,qid integer not null,
aid integer not null,is_correct integer default 0,
FOREIGN KEY (qid) REFERENCES Questions(_id));

然后按照我在表中的数据

INSERT INTO Questions VALUES(1, 'Some text');
INSERT INTO Ques_Ans(qid, aid, is_correct) VALUES(20, 1, 0);

如果在 Ques_Ans 表上正确设置了外键,则第二次插入应该会失败,因为 Questions 表中没有 ID 为 20 的记录,但不知何故我的应用程序没有抛出任何错误并插入第二个插入语句。谁能告诉我这里出了什么问题,或者我是否遗漏了这里的任何配置?

更新 [2012 年 3 月 3 日]:在与@Catcall 讨论后

  • 使用 sqlite3 工具,打开 PRAGMA foreign_keys=ON; 外键按预期工作
  • 同样的事情,如果通过模拟器或手机上的应用程序使用则不起作用
  • 使用 insert()execSQL() 执行插入语句。它们都没有抛出 foreign key constraint failed 错误
  • PRAGMA integrity_check 返回 ok。所以数据库没有损坏。

最佳答案

您的外键位于“qid”列,而不是“_id”列。

这条 INSERT 语句

INSERT INTO Ques_Ans VALUES(20, 1, 0);

应该已经抛出了错误

Error: table Ques_Ans has 4 columns but 3 values were supplied

此 INSERT 应该会成功。

INSERT INTO Ques_Ans VALUES(20, 1, 0, 0);

这个应该会失败。

INSERT INTO Ques_Ans VALUES(21, 2, 0, 0);
Error: foreign key constraint failed

后来。 . .

由于它在 sqlite 中有效,但在您的模拟器中无效,因此问题可能出在模拟器或您的代码中。

这是数据库事务的惯用语。

 db.beginTransaction();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}

Android 文档建议使用 insert()而不是 execSQL() .确保在每个可能返回错误的函数中捕获、捕获或检查错误。因此,例如,如果您切换到 insert(),请检查其返回值是否为 -1。

如果这没有帮助,您可以尝试用“Java”标记这个问题(例如),或者提出一个侧重于您的代码和捕获错误的新问题。

关于Android 2.2 + SQLite + 定义参照完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9508527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com