iOS sqlite3插入数据很慢的原因~解决方法

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄


初用sqlite3插入数据时,插入每条数据大概需要100ms左右。如果是批量导入,可以引进事物提高速度。但是假设你的业务是每间隔几秒插入几条数据,显然100ms是不能容许的。解决办法是,在调用sqlite3_open函数后添加下面一行代码:

    sqlite3_exec(db, "PRAGMA synchronous = OFF; ", 0,0,0);

    上面的解决办法貌似治标不治本,为什么加上上面的代码行,速度会提高那么多?网上解释如下:

磁盘同步

1.如何设置:

PRAGMA synchronous = FULL; (2) 
PRAGMA synchronous = NORMAL; (1) 
PRAGMA synchronous = OFF; (0)


2.参数含义:

当synchronous设置为FULL (2), SQLite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘。这使系统崩溃或电源出问题时能确保数据库在重起后不会损坏。FULL synchronous很安全但很慢。

当synchronous设置为NORMAL, SQLite数据库引擎在大部分紧急时刻会暂停,但不像FULL模式下那么频繁。 NORMAL模式下有很小的几率(但不是不存在)发生电源故障导致数据库损坏的情况。但实际上,在这种情况 下很可能你的硬盘已经不能使用,或者发生了其他的不可恢复的硬件错误。

设置为synchronous OFF (0)时,SQLite在传递数据给系统以后直接继续而不暂停。若运行SQLite的应用程序崩溃, 数据不会损伤,但在系统崩溃或写入数据时意外断电的情况下数据库可能会损坏。另一方面,在synchronous OFF时 一些操作可能会快50倍甚至更多。在SQLite 2中,缺省值为NORMAL.而在3中修改为FULL。

3.建议:

如果有定期备份的机制,而且少量数据丢失可接受,用OFF。


     注意上面红色加粗的字样。总结:如果你的数据对安全性完整性等要求不是太高,可以采用设置为0的方法,毕竟只是“数据库可能会损坏”,至于损坏几率为多大,笔者也暂不知晓。。。。。。还没遇到过损坏,不知什么时候才会发生。


谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中使用 SQLite3 插入数据通常需要以下几个步骤: 1. **连接数据库**: 首先,你需要包含 SQLite 的头文件,并通过 `sqlite3_open_v2` 函数打开数据库。例如: ```cpp sqlite3* db; int rc = sqlite3_open("example.db", &db); if (rc) { // 处理错误 } ``` 2. **创建或选择表**: 确保你要插入数据的表已经存在。如果不存在,可以使用 SQL 创建命令创建它。比如创建一个简单的用户表: ```cpp const char* create_table_sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT);"; if (sqlite3_exec(db, create_table_sql, nullptr, nullptr, nullptr) != SQLITE_OK) { // 处理错误 } ``` 3. **准备 SQL 语句**: 使用 `sqlite3_prepare_v2` 准备插入数据的 SQL 语句。这里是一个插入示例: ```cpp const char* insert_sql = "INSERT INTO users (name, email) VALUES (?, ?)"; sqlite3_stmt* stmt; rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, nullptr); if (rc != SQLITE_OK) { // 处理错误 } ``` 4. **绑定参数**: 对于每个要插入数据项,你可以使用 `sqlite3_bind_text` 或者其他适当的函数绑定到 SQL 语句中对应的占位符。例如,插入字符串和整数: ```cpp std::string name = "John Doe"; std::string email = "john.doe@example.com"; sqlite3_bind_text(stmt, 1, name.c_str(), -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, email.c_str(), -1, SQLITE_TRANSIENT); ``` 5. **执行 SQL**: 调用 `sqlite3_step` 执行 SQL 语句。如果成功,`SQLITE_DONE` 表示操作完成;如果有错误,处理错误。 ```cpp while (sqlite3_step(stmt) == SQLITE_ROW) { // 操作已完成,无需做任何事情 } if (sqlite3_step(stmt) != SQLITE_DONE) { // 处理错误 } ``` 6. **清理资源**: 最后,记得释放资源: ```cpp sqlite3_finalize(stmt); sqlite3_close(db); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值