我尝试使用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不熟悉的人我真的需要它。
答案 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
中的那个返回101
(SQLITE_DONE
),但if语句中的那个可能会返回SQLITE_MISUSE
(http://www.sqlite.org/c3ref/step.html)。