2

我的 iOS 应用程序中有一个本地 SQLite3 数据库。

通常一切都按需要工作,但有时SQLITE_CONSTRAINT当我尝试将insert新记录添加到我的表中时,我会收到一个奇怪的错误 (),调用sqlite3_step(statement)方法。这发生在表被删除并重新创建一次之后。(是的,我需要删除表并重新创建,而不仅仅是删除我的所有记录)。


这是我创建表格的方式。

CREATE TABLE MyTable (
reference text PRIMARY KEY not null collate nocase, 
value text not null collate nocase)

我的表没有任何创建的手动索引,只是自动生成了唯一索引"sqlite_autoindex_mytable_1"。正如我在这里读到的(lang_creatable),这是一种正常情况。


这是一些代码:

sqlite3_stmt *statement;
int result = sqlite3_prepare_v2(database, [sqlString UTF8String], -1, &statement, NULL);
if (result == SQLITE_OK) {

   int sql_result = sqlite3_step(statement);
   // here is receive sql_result == SQLITE_CONSTRAINT (19)
}

问题不一定在 sql 查询字符串中。正如我还读到的,当我尝试插入一些具有与已经存在的相同主键的记录时,我会收到此错误。就我而言,我有一个空表并收到此错误。

所以问题是什么会导致SQLITE_CONSTRAINT错误的原因?删除表后唯一索引不被删除并且仍然包含一些信息吗?

4

1 回答 1

4

您应该查看返回的错误消息sqlite3_errmsg,它会准确地告诉您哪个约束失败以及插入失败的原因。它可能会报告

  • “列引用不是唯一的” - 当reference您尝试插入的值已经存在于表中时,您会得到这个;或者

  • “值可能不是 NULL” - 当您尝试插入NULL定义为NOT NULL.

这两个错误都会以SQLITE_CONSTRAINT. 只有看sqlite3_errmsg才能有效地诊断问题的根源。

坦率地说,我假设前者是问题(reference您插入的表中已经存在),但在您查看 之前sqlite3_errmsg,我们只是在猜测。

int result;

if ((result = sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL)) != SQLITE_OK) {
    NSLog(@"%s: sqlite3_prepare error: %s (%d)", __FUNCTION__, sqlite3_errmsg(database), result);
}

if ((result = sqlite3_step(statement)) != SQLITE_DONE) {
    NSLog(@"%s: step error: %s (%d)", __FUNCTION__, sqlite3_errmsg(database), result);
}
else
    NSLog(@"success");

sqlite3_finalize(statement);

看看sqlite3_errmsg它,它会准确地告诉你出了什么问题。然后,您可能想要检查您尝试插入的值,并将其与表中已有的值以及您定义的约束 ( NOT NULL) 进行比较。

于 2013-09-03T01:40:59.010 回答