当 iPhone 应用程序在向表中插入数据时或期间退出时,如何回滚 SQLite DB?
Posted
技术标签:
【中文标题】当 iPhone 应用程序在向表中插入数据时或期间退出时,如何回滚 SQLite DB?【英文标题】:How do I rollback a SQLite DB when iPhone application quits while or during inserting data into table? 【发布时间】:2012-08-01 23:05:23 【问题描述】:我正在为我的 iPhone 应用程序使用 SQLite(没有任何外部库)。我有将近 500 行的大量数据(来自 Web 服务,因此无法从 sqlite 管理器手动插入)要插入到 SQLite 表中。 我检查了日志,插入成功。
if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
但是当应用程序在插入操作中退出时,只有一些行被插入,例如说200。那么当应用程序在插入操作中退出时,有没有办法完全回滚? 因此,当我重新启动应用程序时,我只读取了 200 行。
注意:我使用的是 NSOperationQueue,因此我的应用在插入过程中运行没有任何故障(整个插入需要近 20 秒)
是否有针对这种情况的参考教程以避免不完整地插入 SQLite? 我知道我可能必须为此使用事务,但有什么好的参考吗?
任何帮助将不胜感激。
【问题讨论】:
您提到不添加任何库。如果我记得 sqlite3 有一个库。你至少有链接吗? @stunner 你能解释一下怎么做吗? 注意:我已经添加了 libsqlite3.dylib 并且所有正常的 sql 操作都工作正常 在任何问题的每个答案的左侧,都有一个用于对问题进行投票的向上箭头和向下箭头。在向下箭头下方有一个复选标记,当答案充分回答了您的问题时,应选中该复选标记。 【参考方案1】:您可以开始交易并结束。简单案例:
sqlite3_exec(database, "BEGIN", 0, 0, 0);
... (your insert code)
sqlite3_exec(database, "COMMIT", 0, 0, 0);
【讨论】:
但是 sqlite3_exec(database, "COMMIT", 0, 0, 0);如果应用程序在插入操作之间退出,则执行,我是否必须回滚操作? 它们是在 sqlite 表中管理多个插入的完整参考吗,我正在使用事务“BEGIN”(插入之前)和“COMMIT”(所有插入语句之后),但仍然只插入了一些记录。 【参考方案2】:幸好我找到了出路:
if ([db_handle openConnectionSucess]==1 && (sqlite3_exec(database, "BEGIN", 0, 0, 0))==SQLITE_OK)
char *error;
NSString *insertStatement = [NSString stringWithFormat:@"insert into StationTbl (id, name, address) VALUES (\"%@\", \"%@\", \"%f\", \"%f\")",id,name,value];
if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
else
NSLog(@"Error: %s", error);
if(sqlite3_exec(database, "COMMIT", 0, 0, 0) ==SQLITE_OK)
else
sqlite3_exec(database, "ROLLBACK", 0, 0, 0);
它解决了两个目的:
插入最多在 3 秒内执行(比较到 25 秒没有 使用交易
应用退出会自动回滚。
感谢所有在帖子中做出努力的人!
【讨论】:
这正是我的回答。如果您不介意,请接受:-)以上是关于当 iPhone 应用程序在向表中插入数据时或期间退出时,如何回滚 SQLite DB?的主要内容,如果未能解决你的问题,请参考以下文章
IDENTITY_INSERT设置为OFF时,不能向表中插入显式值
IDENTITY_INSERT设置为OFF时,不能向表中插入显式值
IDENTITY_INSERT设置为OFF时,不能向表中插入显式值