2011-08-05 103 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

退房的字符串值,如果它包含,查詢字符串不會是完整的。只需將'''替換。如果可能的話。你應該在查詢字符串中存儲要存儲的值嗎?