如何用FMDB SDK更改SQLite表达式树的最大深度?

时间:2014-01-15 10:24:18

标签: objective-c sqlite fmdb

我正在使用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];

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

我试错了,数据插入正确,for-loop设置为i <500,而设置i&lt; 501,没有插入数据。

然后我搜索http://www.sqlite.org/limits.html,此页面上有一个表达式树的最大深度,它应该是我想要设置的,但是如何设置此属性使用FMDB?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

因此,您需要重新编译并以0的限制进行链接。请注意,运行时限制调用仅允许您降低编译的限制,如果它设置为高于0(默认值为100)< / p>

  

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