Ios 主键插入-带Objective-C的SQLite

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 = [

我正在尝试使用Objective-C将用户信息写入SQLite数据库。我在SQLite网站FAQ()上阅读了输入NULL来代替主键的内容,我已经这样做了。但是,当我执行
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来说,我真的需要它。

SQL
NULL
不同于C
NULL

将值中的第一个
\“%@\”
替换为literal
NULL
,并从格式参数中删除
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语句修复了该问题。谢谢!