SQLite表达式最大深度限制

时间:2012-03-05 16:27:59

标签: objective-c macos cocoa sqlite

环境:mac os x Snow Leopard上的Cocoa

我已达到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)

是不是?

2 个答案:

答案 0 :(得分: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 (...

我很幸运,因为我的括号无论如何都没有意义,可以轻松放置。 不是很干净,但它有助于显着减少崩溃,所以在这种情况下我很满意。

答案 1 :(得分:2)

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

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

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