在 iOS 6.0 的单个 sqlite 查询中插入 400 行时。
e.g: INSERT INTO MYTAB (NAME ,ADD) values("name1","add1"),("name2","add2"),("name3","add3"),.....
,完美运行,但是在 5.0 中运行相同的代码时会出现错误:
“,”附近的语法错误。
在 iOS 6.0 的单个 sqlite 查询中插入 400 行时。
e.g: INSERT INTO MYTAB (NAME ,ADD) values("name1","add1"),("name2","add2"),("name3","add3"),.....
,完美运行,但是在 5.0 中运行相同的代码时会出现错误:
“,”附近的语法错误。
考虑使用事务和准备好的 sqlite 语句。
NSString* query;
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
query = @"BEGIN TRANSACTION";
ret = sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL);
sqlite3_stmt *compiledStatement;
NSString* str = @"INSERT INTO MYTAB (NAME, ADD) values (?,?)";
sqlite3_prepare_v2(database, [str UTF8String], -1, &compiledStatement, NULL);
for (int i=0; i<50; i++)
{
const char *name = "name";
const char *add = "add";
sqlite3_bind_text(compiledStatement, 1, name, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledStatement, 2, add, -1, SQLITE_TRANSIENT);
ret = sqlite3_step(compiledStatement);
ret = sqlite3_reset(compiledStatement);
}
sqlite3_finalize(compiledStatement);
query = @"COMMIT TRANSACTION";
ret = sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL);
sqlite3_close(database);
}
SQLite 3.7.11之前不支持此语法:
增强 INSERT 语法以允许通过 VALUES 子句插入多行。
iOS 5 使用 3.7.7,iOS 6 使用 3.7.13似乎是iOS 5中查询失败的原因。
您仍然可以使用此处提到的单独的 INSERT 语句或解决方法或准备好的语句,但如果您只需要有效地预填充数据库,那么您也可以遵循此处提到的建议。