2011-08-05 151 views
0

我在将数据插入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列,尽管IDPRIMARY KEYUNIQUE限制,它应该是不可取的... 任何建议?谢谢。

回答

3

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

因为在第二次插入行时存在sql错误列ID不唯一。

您正在通过指定列名称来插入新记录,但未指定'id'列的值,因此它将采用默认值1,但插入第一条记录时已将其设置为表格。 (2,'A','A');(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); 
+0

我的id_user是一个int。 我做了你所说的,它的工作原理!,非常感谢你Control-V! – user740413

+0

当插入多个值时,我正在复制id的。我正在使用SQLITE_MANAGER,无法设置AUTOINCREMENT值,并且它是自动设置的。 – user740413

-1

退房的字符串值,如果它包含,查询字符串不会是完整的。只需将'''替换。如果可能的话。你应该在查询字符串中存储要存储的值吗?