【问题标题】:Database insertion taking too much time ios sqlite数据库插入花费太多时间 ios sqlite
【发布时间】:2014-01-21 12:22:46
【问题描述】:

我正在尝试将大约 500 条记录插入到 sqlite 数据库中,这需要 20 秒,这太多了!谁能告诉我如何优化它。

for (int i = 0 ; i< [[[dic objectForKey:@"response" ]objectForKey:@"requete"]count]; i++) {
        [sqlManager executeQuery:[[[dic  objectForKey:@"response"]objectForKey:@"requetes"]objectAtIndex:i]];
    }

-(void)executeQuery:(NSString*)_query
{
sqlite3 *database;
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {

    if(sqlite3_exec(database, [_query UTF8String],NULL, NULL, NULL) == SQLITE_OK){
        //NSLog(@"Query Success");
    }
    else{
       // NSLog(@"Query Failed");
    }
    sqlite3_close(database);
}
sqlite3_close(database);
}

【问题讨论】:

  • 只打开一次。如果您要进行多次插入,则开始一个事务。
  • 只是建议使用 FMDB github.com/ccgus/fmdb 你可以使用事务然后不用担心回滚
  • 请注意,无需在每次操作时都打开/关闭。如果应用程序在数据库打开时崩溃,SQLite 在保存数据方面非常强大。一旦你完成了“提交”(除非你开始一个事务,否则它会在每个操作之后隐式发生),保证数据被写入磁盘。

标签: ios sqlite


【解决方案1】:
  1. 打开一次并保持打开状态,直到应用程序关闭或您完成 DB-intense 阶段。如果您的应用在数据库打开时“崩溃”,SQLite 可以轻松处理这种情况。
  2. 当同时执行多个插入时,如果它们全部执行或都不执行都可以,请启动一个事务(并在完成后提交)。当您没有显式启动事务时,SQLite 会围绕每个插入或更新执行隐式启动/提交,“强制”数据到“磁盘”。这需要很多时间。围绕一堆插入执行一次启动/提交将使插入性能至少提高 10 倍。

【讨论】:

  • 我使用了您的以下解决方案,它对我有用,但我在后台再做一件事来更新来自服务器的一些记录,它是 crash。你能给我一个解决方案吗?
  • @ilesh - 如果你在“后台”做一些事情,那么你很多人都没有正确序列化。
【解决方案2】:

你即将Open &amp; closing the database for every Query(insertion)。所以也需要时间。

example一次插入多条记录。

【讨论】:

  • 你从哪里开始交易?
  • 如果准备失败,你让数据库保持打开状态。
  • @HotLicks 好的,我刚刚重新发布了我的示例。那只是作为参考的例子。我不能提供完整的解决方案好吗....?
  • 如果准备失败,您仍然让数据库保持打开状态。
  • 一个好的插图根本不会显示打开/关闭数据库(除了可能是“懒惰”打开),因为每次操作都打开/关闭很愚蠢。
【解决方案3】:

我认为你必须保持你的数据库处于打开状态。

需要更多时间的是打开和关闭数据库。

例如,仅为该插入创建一个方法,在第一个元素中打开数据库并在最后一个元素之后关闭它。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2012-03-17
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多