0

我正在为我的 iPhone 应用程序使用 SQLite(没有任何外部库)。我有将近 500 行的大量数据(来自 Web 服务,因此无法从 sqlite 管理器手动插入)要插入到 SQLite 表中。我检查了日志并成功执行了插入。

if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)

但是当应用程序在插入操作中退出时,只有一些行被插入,例如说 200。那么当应用程序在插入操作中退出时,有没有办法完全回滚?因此,当我重新启动应用程序时,我只读取了 200 行。

注意:我正在使用 NSOperationQueue,因此我的应用程序在插入过程中运行没有任何故障(整个插入需要近 20 秒)

是否有针对这种情况的参考教程以避免不完整地插入 SQLite?我知道我可能不得不为此使用事务,但是有什么好的参考吗?

任何帮助,将不胜感激。

4

2 回答 2

1

幸好我找到了出路:

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);
      }
}

它解决了两个目的:

  1. 插入最多在 3 秒内执行(在不使用事务的情况下相当于 25 秒)

  2. 如果应用程序退出,它会自动回滚。

感谢所有在帖子中付出努力的人!!

于 2012-08-02T14:30:46.280 回答
1

您可以开始交易并结束。简单案例:

sqlite3_exec(database, "BEGIN", 0, 0, 0);

... (your insert code)

sqlite3_exec(database, "COMMIT", 0, 0, 0);
于 2012-08-01T23:40:15.660 回答