SQLite插入错误“约束失败”

时间:2011-08-05 08:12:24

标签: iphone sqlite

我在将数据插入sqlite表时遇到问题,我已经阅读了很多帖子但仍未找到任何解决方案,希望你能帮助我。

我的表定义是:

CREATE TABLE "forum_topics" ("id" INTEGER (11) PRIMARY KEY  NOT NULL  UNIQUE  DEFAULT 1, "id_user" INTEGER (11) NOT NULL  DEFAULT 0, "title" TEXT NOT NULL  DEFAULT None, "description" TEXT NOT NULL  DEFAULT None)

执行以下功能时遇到了这个问题:

- (void)addTopic{
    if (addStmt == nil) {
        const char *sql = "INSERT INTO forum_topics (id_user, title, description) VALUES (?, ?, ?)";
        if (sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) {
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }
    }
    sqlite3_bind_int(addStmt, 1, id_user);
    sqlite3_bind_text(addStmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStmt, 3, [desc UTF8String], -1, SQLITE_TRANSIENT);


    if (SQLITE_DONE != sqlite3_step(addStmt)) {
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    }
    else {
        self._id = sqlite3_last_insert_rowid(database);
    }
    sqlite3_reset(addStmt);
    sqlite3_finalize(addStmt);
    addStmt = nil;
}

好吧,我也尝试强制绑定表格的 id 列,尽管 id PRIMARY KEY <但它并没有崩溃/ strong>和 UNIQUE 约束,它应该是不可设置的...... 有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:3)

你能告诉我们你得到了什么错误吗? 你是id_user变量是一个真正的整数,如果不是那么i = [id_user intValue];

因为存在sql错误,所以当您第二次插入行时,列ID不是唯一的。

您正在通过指定列名来插入新记录,但是您没有指定“id”列的值,因此它假设默认值为1,但在插入第一条记录时已经设置为表。

INSERT INTO forum_topics(id_user,title,description)VALUES(2,'A','A'); //第一次

但是当您第二次插入时,您没有指定“id”列的值,此列的默认值为1 (但是第一次插入记录时已保存) 。 所以如果你想避免,你必须指定'id'列值唯一

INSERT INTO forum_topics(id,id_user,title,description)VALUES(2,2,'A','A'); //现在这将成功插入行。 将架构更改为

CREATE TABLE "forum_topics" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "id_user" INTEGER (11) NOT NULL  DEFAULT 0, "title" TEXT NOT NULL  DEFAULT None, "description" TEXT NOT NULL  DEFAULT None);

答案 1 :(得分:-1)

检查字符串值,如果它包含',查询字符串将不会完整。只需将'替换为''。如果可能的话。你应该发布带​​有要存储的值的查询字符串吗?