2011-08-05 9 views
0

sqliteテーブルにデータを挿入するときに問題が発生しましたが、多くの投稿を読みましたが、解決策が見つかりませんでした。SQLiteの挿入エラー "Constraint Failed"

私のテーブルの定義は次のとおりです。

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があるという事実にもかかわらず、クラッシュしなかった。プライマリキーユニークの制約とそれは設定不可能であるはずです... 何か提案がありますか?ありがとうございました。

答えて

3

どのようなエラーが表示されますか? id_user変数は実数ですか?そうでなければi = [id_user intValue];

カラムが2回目に挿入されたときに、SQLエラーカラムIDがユニークではないためです。

列名を指定して新しいレコードを挿入していますが、最初のレコードを挿入するときに既定値1とみなされるように 'id'列の値は指定されていません。

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); 
+0

私のid_userはintです。 私はあなたが言ったことをした、それは動作します!、非常にコントロール - Vをありがとう! – user740413

+0

2つ以上の値を挿入するときに、IDを複製していました。私はSQLite_MANAGERを使用していて、AUTOINCREMENT値を設定することができず、自動的に設定されました。 – user740413

-1

にスキーマを変更 それは"が含まれている場合は、クエリ文字列は、文句を言わない完全で、その文字列の値をチェックしてください。 '' 'と置き換えてください。可能であればあなたに。格納する値を含むクエリ文字列を投稿しますか?

関連する問題