【问题标题】:Bulk Database insertion not supported in iOS below 6.0 [closed]6.0以下的iOS不支持批量数据库插入[关闭]
【发布时间】:2023-03-03 07:46:27
【问题描述】:

在 iOS 6.0 的单个 sqlite 查询中插入 400 行时。

e.g:  INSERT INTO MYTAB (NAME ,ADD) values("name1","add1"),("name2","add2"),("name3","add3"),.....

,完美运行,但在 5.0 中运行相同的代码时会报错:

“,”附近的语法错误。

【问题讨论】:

标签: ios objective-c sqlite


【解决方案1】:

考虑使用事务和准备好的 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);
}

【讨论】:

  • 谢谢Vame。我使用 sqlite3_exe 做了同样的事情,但它给出了错误.. 在 BEGIN TRANSACTION 之后也设置了“PRAGMA synchronous = OFF”。但同样的错误......
  • 什么样的错误?编辑您的问题并发布一些代码,以便我们查看
【解决方案2】:

SQLite 3.7.11 之前不支持此语法:

增强 INSERT 语法以允许通过 VALUES 子句插入多行。

似乎iOS 5 uses 3.7.7, iOS 6 uses 3.7.13 以及在 iOS 5 中查询失败的原因。

您仍然可以使用单独的 INSERT 语句或提到的解决方法 here 或准备好的语句,但如果您只是需要有效地预填充数据库,那么您也可以遵循 suggestions mentioned here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多