目标C"无法打开数据库文件"在循环SQLite

时间:2017-08-09 12:16:21

标签: ios objective-c sqlite for-loop sql-insert

我在for循环中插入了超过42000个数据并且它正常工作了一段时间,就像它插入了2000多个数据但在此之后崩溃了无法打开数据库档案

这是插入代码

This is the insertion code

这是连接代码

this is the connection code

在循环中调用insertReceiptReport。我是iOS新手,这就是为什么不确定我错过了什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码在单个交易中插入多行

char* error;
sqlite3_exec(mDb, "BEGIN TRANSACTION", NULL, NULL, &error);
char buffer[] = "INSERT INTO example VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
sqlite3_stmt* stmt;
sqlite3_prepare_v2(mDb, buffer, strlen(buffer), &stmt, NULL);
for (unsigned i = 0; i < mVal; i++) {
    std::string id = getID();
    sqlite3_bind_text(stmt, 1, id.c_str(), id.size(), SQLITE_STATIC);
    sqlite3_bind_double(stmt, 2, getDouble());
    sqlite3_bind_double(stmt, 3, getDouble());
    sqlite3_bind_double(stmt, 4, getDouble());
    sqlite3_bind_int(stmt, 5, getInt());
    sqlite3_bind_int(stmt, 6, getInt());
    sqlite3_bind_int(stmt, 7, getInt());
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        printf("Commit Failed!\n");
    }
    sqlite3_reset(stmt);
}
sqlite3_exec(mDb, "COMMIT TRANSACTION", NULL, NULL, &error);
sqlite3_finalize(stmt);

由此BEGIN&amp; COMMIT您可以在DB中插入多行的事务。

有关详细信息,请参阅此链接:Bulk Row Insert

修改

要检查数据是否已经更新行要求,您可以使用以下插入查询:

INSERT OR REPLACE INTO <TableName> VALUES ()
  

注意:只有在表格中有PRIMARY KEY时,上述查询才有效。

希望这有助于解决您的问题。