【问题标题】:Bulk Insert to Sqlite3 causing Db Error: Library routine called out of sequence批量插入到 Sqlite3 导致 Db 错误:库例程调用顺序不正确
【发布时间】:2011-03-28 18:28:12
【问题描述】:

在我的 iphone 应用程序更新后,我需要加载一些配置数据。我将包含一堆 SQL 语句(800+)的文件捆绑在一个文件中,以便在首次启动时运行。看来我现在可能被画在角落里了。如果我在启动时在主线程上运行它,运行时间太长以至于应用程序由于启动时间过长而崩溃。如果我在单独的线程上运行它,我会收到数据库争用错误(库例程调用乱序)。我认为这是因为应用程序继续在主线程上加载和读取数据库。

这是从CSV文件接收数据然后循环并写入DB的方法。

关于如何使其在启动时运行得更快或在低优先级后台线程上成功运行而不争用的任何想法?

+ (void) updateDB:(NSString *)data {
    NSArray  *lineArray = [data componentsSeparatedByString:@"\n"];
    if (sqlite3_open([[BIUtility getDBPath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSLog(@"Failed to opendatabase in updateDB");
    }
    char *errorMsg;

    for(int k = 0; k < [lineArray count]; k++){
        NSString *loadSQLi = [lineArray objectAtIndex:k];

        if (sqlite3_exec(database, [loadSQLi UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
            NSLog(@"DB Error. '%s'", sqlite3_errmsg(database));
        }

    }

    if(database) sqlite3_close(database);

}

【问题讨论】:

    标签: iphone objective-c multithreading sqlite


    【解决方案1】:

    您可以通过在单个事务中执行所有插入而不是在单独的事务中执行插入来加快这一速度,因为它在该代码中默认发生。

    【讨论】:

      【解决方案2】:
      + (void) updateDB:(NSString *)data {
          NSArray  *lineArray = [data componentsSeparatedByString:@"\n"];
          if (sqlite3_open([[BIUtility getDBPath] UTF8String], &database) != SQLITE_OK) {
              sqlite3_close(database);
              NSLog(@"Failed to opendatabase in updateDB");
          }
          char *errorMsg;
      
          execQuery(@"Begin Transaction");
      
          for(int k = 0; k < [lineArray count]; k++){
              NSString *loadSQLi = [lineArray objectAtIndex:k];
              execQuery(loadSQLi);
          }
      
          execQuery(@"Commit");
      
          if(database) sqlite3_close(database);
      
      }
      
      + (void) execQuery:(NSString *)query {
          char *errorMsg;
          if (sqlite3_exec(database, [query UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
              NSLog(@"DB Error. '%s'", sqlite3_errmsg(database));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2017-08-23
        相关资源
        最近更新 更多