【问题标题】:How to change the Maximum Depth Of An Expression Tree of SQLite with FMDB SDK?如何使用 FMDB SDK 更改 SQLite 表达式树的最大深度?
【发布时间】:2014-02-03 18:27:21
【问题描述】:

我正在使用 FMDB 实现一个基于 SQLite 的应用程序,我需要在 SQLite 中插入大量数据,比如 1000 行数据,但我不想一一插入,我只想这样做使用单个查询,这会使插入进度更快,如下所示:

NSString *query = @"insert into table (c1,c2,c3,c4) values " ;
NSString *middle = @"" ;
for ( int i = 0 ; i < 1000 ; i++ ) {

    NSDictionary *tmpItem = [data objectAtIndex:i] ;

    if ( i == 999 ) {

        middle = [NSString stringWithFormat:@"%@('%@','%@','%@','%@')", middle,[tmpItem objectForKey:@"c1"],[tmpItem objectForKey:@"c2"],[tmpItem objectForKey:@"c3"],[tmpItem objectForKey:@"c4"]] ;
    }

    else {

        middle = [NSString stringWithFormat:@"%@('%@','%@','%@','%@') ,", middle,[tmpItem objectForKey:@"c1"],[tmpItem objectForKey:@"c2"],[tmpItem objectForKey:@"c3"],[tmpItem objectForKey:@"c4"]] ;
    }
}

query = [NSString stringWithFormat:@"%@%@", query, middle] ;
[db executeUpdate:query];

上面的代码不能在“表”上插入任何数据,但是当我将for循环更改为只运行10次时,数据插入正确,这意味着没有语法错误。

我试错了,数据插入正确,for循环设置为i

然后我搜索http://www.sqlite.org/limits.html,在这个页面上有一个Maximum Depth Of An Expression Tree,应该是我要设置的,但是在使用FMDB的时候如何设置这个属性?

或者我可以插入大量数据的唯一方法就是将它们一个一个插入?

【问题讨论】:

  • 阅读FMDB自述文件,注意使用FMDatabaseQueue部分。
  • 对不起,我读过这部分。我不在不同的线程中使用 FMDatabase 对象,这只是我对 FMDatabase 对象使用的唯一操作。

标签: objective-c sqlite fmdb


【解决方案1】:

您的选择不限于一次或全部。

您可以分批插入数据,这仍然可以提高速度,但也更容易预测成功。更改限制仍然只是这样,仍然是一个限制(根据数据,您可能会遇到其他限制)。一次批处理 100 个似乎是合理的。

还要确保您没有在主 UI 线程上进行大量批处理工作。

除此之外,如果您编译自己的 sqlite 二进制文件,您提供的 sqlite 链接具有预处理器编译设置。 FMDB 只是 sqlite 的包装器,默认情况下,在 iOS 上,您将获得与 iOS 一起打包的 sqlite。当然,您可以通过更改限制自行编译并链接到您的应用。

因此,您需要重新编译并链接限制为 0。请注意,运行时限制调用仅允许您降低编译限制设置为高于 0(默认为 100)

表达式树的最大深度可以在运行时降低 如果使用 sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) 接口 SQLITE_MAX_EXPR_DEPTH 最初是正数。换句话说, 如果存在,则可以在运行时降低最大表达深度 已经是表达式深度的编译时限制。如果 SQLITE_MAX_EXPR_DEPTH 在编译时设置为 0(如果 表达式是无限的)然后 sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) 是空操作。

【讨论】:

  • 感谢@bryanmac的回复,我现在一次批处理100个数据,因为它仍然比一个一个插入数据要快,而我不需要更改限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2015-10-11
相关资源
最近更新 更多