2012-03-05 129 views
2

环境:可可在Mac OS X Snow Leopard的SQLite的表达最大深度限制

我已经达到了一个SQLite查询的上限(默认)深度:

Expression tree is too large (maximum depth 1000) 

sqlite的documentation说来设置SQLITE_MAX_EXPR_DEPTH在汇编,但如何?我使用默认sqlite3的框架,用进口:

#import <sqlite3.h> 

注:我认为最大表达深度可在运行时降低(不增加)有:

sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) 

这是正确的?

+0

有没有这样的运气? – QED 2012-03-06 04:09:49

回答

2

你对所有的断言都是正确的(这是一个编译时设置,它可以在运行时不降低)。您的选择是限制您的查询或将自定义版本的SQLite与生产应用程序链接起来。

SQLite的好处在于它的构建非常简单。阅读关于custom builds。此外,苹果的OS X 10.6.8的SQLite XCode项目是here。无论您使用Apple的项目还是创建自己的项目,都可以轻松创建共享库,将静态链接导入您的可执行文件以随项目一起发布。在发布代码时,您将不得不担心兼容性问题,但这是您为复杂查询付出的代价。

您还可以在另一个问题上询问如何简化复杂查询。

+1

宾果!谢谢!自动回答后人: 为了解决这个问题,我使用sqlite3 [合并] [1](ZIP存档包含SQLite 3.7.10的所有C源代码合并成一个源文件),步骤: 1. download最终导入sqlite.h和.C在项目 2.拆下源码框架 3.找到SQLITE_MAX_EXPR_DEPTH 1000 sqlite.c与SQLITE_MAX_EXPR_DEPTH 0 享受更换;) [1]:HTTP:// WWW。 sqlite.org/sqlite-amalgamation-3071000.zip – Kappe 2012-03-06 10:57:38

3

更简单的解决方案(虽然远非完美)。

我有同样的错误,我不得不使用Android默认的SQLite实现(查询系统音频数据库)。

这个问题出现了,因为我删除了一些“无用的”括号,所以我把它们放回去了,没有更多的错误。

崩溃:

id = 387 OR id = 388 OR id = 390 OR id = 391 [...] OR id = 392 

不会崩溃:

(id = 387 OR id = 388 [...] OR id = 390) OR (id = 391 [...] OR id = 392) OR (... 

我幸运,因为我的括号是无论如何也有意义,可以很容易地放置。 不是很干净,但它有助于显着减少崩溃,所以我很高兴在这种情况下。