我的iOS应用程序中有一个本地iOS数据库。
通常一切都按需要工作,但有时当我尝试将一个新记录insert到我的表,调用sqlite3_step(statement)方法时,会收到一个奇怪的错误(sqlite3_step(statement))。在删除和重新创建表一次之后就会发生这种情况。(是的,我需要删除该表并重新创建,而不仅仅是删除本例中的所有记录)。
下面是我创建表的方法。
CREATE TABLE MyTable (
reference text PRIMARY KEY not null collate nocase,
value text not null collate nocase)我的表没有任何创建的手动索引,只是自动生成唯一的索引"sqlite_autoindex_mytable_1"。正如我所读的(可创作),这是一个正常的情况。
以下是一些代码:
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错误的原因呢?唯一的索引是否可以在删除表后不被删除,并且仍然包含一些信息?
发布于 2013-09-03 01:40:59
您应该查看sqlite3_errmsg返回的错误消息,它将准确地告诉您哪个约束失败,以及插入失败的原因。它可能会报告
reference值已经存在于表中时,就会得到它;或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)进行比较。
https://stackoverflow.com/questions/18581156
复制相似问题