【问题标题】:SQLite expression maximum depth limitSQLite 表达式最大深度限制
【发布时间】:2012-03-23 03:13:33
【问题描述】:

环境: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)

对吗?

【问题讨论】:

    标签: objective-c macos cocoa sqlite


    【解决方案1】:

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

    我遇到了同样的错误,我不得不使用 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 (...
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 宾果游戏!谢谢!后代的自动回答:为了解决这个问题,我使用 sqlite3 [amalgamation][1](ZIP 存档包含 SQLite 3.7.10 的所有 C 源代码合并到一个源文件中),步骤:1. 下载结束导入 sqlite .h 和 .c 在您的项目中 2. 删除 sqlite 框架 3. 在 sqlite.c 中找到 SQLITE_MAX_EXPR_DEPTH 1000 并替换为 SQLITE_MAX_EXPR_DEPTH 0 enjoy ;) [1]: sqlite.org/sqlite-amalgamation-3071000.zip
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多