Ios 主键插入-带Objective-C的SQLite
我正在尝试使用Objective-C将用户信息写入SQLite数据库。我在SQLite网站FAQ()上阅读了输入NULL来代替主键的内容,我已经这样做了。但是,当我执行Ios 主键插入-带Objective-C的SQLite,ios,sql,objective-c,database,sqlite,Ios,Sql,Objective C,Database,Sqlite,我正在尝试使用Objective-C将用户信息写入SQLite数据库。我在SQLite网站FAQ()上阅读了输入NULL来代替主键的内容,我已经这样做了。但是,当我执行NSLog(@“%d”,sqlite3_步骤(sqlStatement)时,我得到了错误代码20(数据类型不匹配)。下面是相关代码 在任何人询问之前,我已经在前面的代码中正确地打开了数据库,所以这不是问题所在 sqlite3_stmt *sqlStatement; NSString *momentInsertSQL = [
NSLog(@“%d”,sqlite3_步骤(sqlStatement)
时,我得到了错误代码20(数据类型不匹配)。下面是相关代码
在任何人询问之前,我已经在前面的代码中正确地打开了数据库,所以这不是问题所在
sqlite3_stmt *sqlStatement;
NSString *momentInsertSQL = [NSString stringWithFormat:@"INSERT INTO MomentTbl (momentID, albumID, title, timestamp, author, latitude, longitude, canvas) VALUES (\"%@\", \"%d\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",NULL, alb.ID, alb.title, m.timestamp, @"user", m.latitude, m.longitude, m.moment];
const char *query_stmt = [momentInsertSQL UTF8String];
const char *dbPath = [writableDBPath UTF8String];
if(sqlite3_open(dbPath, &db) == SQLITE_OK) {
if(sqlite3_prepare(db, query_stmt, -1, &sqlStatement, NULL) == SQLITE_OK)
{
sqlite3_prepare_v2(db, query_stmt, -1, &sqlStatement, NULL);
NSLog(@"%d", sqlite3_step(sqlStatement));
if(sqlite3_step(sqlStatement) == SQLITE_DONE)
NSLog(@"OK");
else
NSLog(@"Problem");
sqlite3_finalize(sqlStatement);
sqlite3_close(db);
}
}
当我用一个数字替换NULL时,返回的代码是101,这应该是
SQLITE\u DONE
,但是NSLog仍然显示出“问题”。任何帮助都是非常感谢的,因为对于SQLITE来说,我真的需要它。SQLNULL
不同于CNULL
将值中的第一个\“%@\”
替换为literalNULL
,并从格式参数中删除NULL
,例如:
NSString *momentInsertSQL = [NSString stringWithFormat:@"INSERT INTO MomentTbl (momentID, albumID, title, timestamp, author, latitude, longitude, canvas) VALUES (NULL, \"%d\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", alb.ID, alb.title, m.timestamp, @"t-panda", m.latitude, m.longitude, m.moment];
或者,您可以完全省略主键
momentID
。sqlite在您没有指定值的列中插入一个NULL
。我认为这是因为您有两个sqlite3\u步骤
调用,其间没有sqlite3\u重置
NSLog
中的一个返回101
(SQLITE\u DONE
),但是if语句中的一个很可能返回SQLITE\u
().Emm…你不应该给主键赋值!所以我应该将momentID及其对应的值完全保留在insert语句中?仅供参考-使用stringWithFormat
构建查询是一种糟糕的做法。请使用正确的方法(使用各种sqlite3\u bind\u xxx
函数)。将我的代码更改为您所说的代码后,NSLog返回的代码是101。SQLite的网站说这相当于SQLite_DONE,但是if(sqlite3_step(sqlStatement)==SQLite_DONE)
的计算结果仍然为false。无需担心-删除NSLog语句修复了该问题。谢谢!