当 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时,不能向表中插入显式值

IDENTITY_INSERT设置为OFF时,不能向表中插入显式值

如何使用循环向表中插入数据。?

向表中插入多行 - Access