主键插入 - 带Objective-C的SQLite

时间:2014-07-14 22:06:05

标签: ios sql objective-c database sqlite

我尝试使用Objective-C将用户信息写入SQLite数据库。我在SQLite网站上阅读FAQ(http://www.sqlite.org/faq.html),输入NULL代替主键,我已经完成了。但是,当我执行NSLog(@"%d",sqlite3_step(sqlStatement)时,我收到错误代码20(数据类型不匹配)。以下是相关代码。

在有人要求之前,我已经在之前的代码中正确地打开了数据库,因此这不是问题所在。 writableDBPath是数据库的路径,经验证有效。

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_DONE,但NSLog仍然显示"问题。"感谢任何帮助,因为对SQLite不熟悉的人我真的需要它。

2 个答案:

答案 0 :(得分:0)

SQL NULL与C NULL不同。

将值中的第一个\"%@\"替换为文字NULL,并从格式args中删除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

答案 1 :(得分:0)

我认为这是因为您之间没有sqlite3_step两次sqlite3_reset来电。

NSLog中的那个返回101SQLITE_DONE),但if语句中的那个可能会返回SQLITE_MISUSEhttp://www.sqlite.org/c3ref/step.html)。