我在将数据插入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 约束,它应该是不可设置的...... 有什么建议吗?谢谢。
答案 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)
检查字符串值,如果它包含',查询字符串将不会完整。只需将'替换为''。如果可能的话。你应该发布带有要存储的值的查询字符串吗?