【问题标题】:iPhone App With SQLITE FTS3 Xcode Release Build Not Working带有 SQLITE FTS3 Xcode 版本的 iPhone 应用程序无法正常工作
【发布时间】:2011-01-17 00:26:26
【问题描述】:

我的 iPhone 应用程序使用 SQLITE 的 FTS3 函数(特别是 MATCH 和 OFFSET)。这些对我优化的搜索算法至关重要。我通过在一个名为 SQLite 的组下在我的项目中包含三个 SQLITE 源文件,即 sqlite3.c、sqlite3.h 和 sqlite3ext.h 来实现 FTS3。我从 Frameworks 组中删除了我之前对 libsqlite3.dylib 库的引用。我将“其他 C 标志”和“其他 C++ 标志”项目设置设置为 -DSQLITE_ENABLE_FTS3=1。 (我也尝试简单地将这些标志设置为 -DSQLITE_ENABLE_FTS3。)

应用程序在调试和发布版本的模拟器中都能完美运行。该应用程序在 iPhone 上也能完美运行,但仅用于调试版本!

发布版本不返回任何使用 MATCH 和 OFFSET 关键字的 SQL 调用的结果行。我的具体问题是,“当我在连接 iPhone 的情况下构建发布版本时,我的启用 FTS3 的 SQLITE 版本是否没有与我的应用程序一起安装?”我在我的 Mac 上的相应 Release-iphoneos 子文件夹中看到了 sqlite.o 对象文件。它比 Debug-iphoneos 子文件夹中的小一些,但我认为这是由于缺少调试符号。

我迫切需要一个解决方案,所以任何想法都将不胜感激。

【问题讨论】:

    标签: iphone xcode sqlite release fts3


    【解决方案1】:

    我要做的第一件事是对 iPhone 发布版本进行干净的构建,并详细查看原始构建日志。您可以查看那里执行的实际命令,以查看这些额外的编译器/预处理器标志是否实际配置为用于该目标。

    如果不是,那么您可能在目标设置中犯了错误。

    【讨论】:

    • 感谢您的回复。我现在才意识到我的问题与 fts3 和 sqlite 无关。但是,您的回答确实教会了我原始日志文件的位置,我对它们进行了比较。我从那个练习中学到了很多。但是,我的问题是在 Device-Release 构建中没有调用 cellForRowAtIndexPath - 但它在 Device-Debug 构建和 Simulator-Release 构建中!那就是问题所在。我正在研究和调试,但还没有成功。即使代码相同,为什么行为不同的任何想法?
    【解决方案2】:

    好的,对于那些可能从我的古怪经历中受益的人,这就是解决方案。在拉了很多头发之后,我决定放松发布版本中的一些优化。我这样做只是为了获得有关问题的另一个线索-而不是作为解决方案。果然,代码完美运行!然后,我说“好吧,让我把优化放回最小和最快的地方继续我的调查。”神奇的是,一切仍然有效!总而言之,我唯一做的就是在项目设置中更改优化,然后将其放回原处!当然,所有这一切都是经过大量调试、清理所有目标后重新编译等。在我更改并将优化重置为原始值之前,没有什么不同。疯了,但那是我的故事,我会坚持下去。希望这可以帮助其他遇到此问题的人。

    【讨论】:

      【解决方案3】:

      请注意,如果您只使用 fts3,您可以使用 SDK 附带的普通 sqlite3 库。如果您执行以下操作:

      NSLog(@"Compile options specified when Apple built the library:");
      if (sqlite3_prepare_v2(contentDatabase, "PRAGMA compile_options", -1, &statement, NULL) == SQLITE_OK)
      {
          while (sqlite3_step(statement) == SQLITE_ROW)
          {
              NSLog(@"%s", sqlite3_column_text(statement, 0));
          }
      }
      

      它会告诉你 Apple 在编译默认库时使用了哪些编译选项。当我运行它时,我看到:

      SQLite 版本 = 3.7.2 [数据库] 编译选项:

      ENABLE_FTS3

      ENABLE_FTS3_PARENTHESIS

      ENABLE_LOCKING_STYLE=1

      ENABLE_RTREE

      OMIT_BUILTIN_TEST

      OMIT_LOAD_EXTENSION

      TEMP_STORE=1

      线程安全=2

      这是针对 iOS 4.3.5 编译的。我可以确认 fts3 虚拟表和 MATCH 关键字在我的构建中有效。

      【讨论】:

      • 这是一篇关于调试/检查 sqllite 设置的有用帖子。谢谢。
      【解决方案4】:

      这个答案在以下方面与其他答案不同:

      • 突出显示@Robert Hawkey 提供的有用代码
      • 显示 Xcode 9/Swift 4.0.3 的完整代码和输出
      • 注意,可以识别 iOS 中 SQLite 的有用功能(例如,JSON SQL Functions

      tldr;

      PRAGMA 编译选项; (more on pragma)

      Swift 4.0.3

      func testSQLiteOptions(){
          var db: OpaquePointer? = nil
          var statement: OpaquePointer? = nil
          sqlite3_open(self.dbPath, &db)
          guard db != nil else {return}
          NSLog("Compile options specified when Apple built the library:");
          if (sqlite3_prepare_v2(db, "PRAGMA compile_options", -1, &statement, nil) == SQLITE_OK)
          {
            while (sqlite3_step(statement) == SQLITE_ROW)
            {
              NSLog("%s", sqlite3_column_text(statement, 0));
            }
          }
        }
      

      输出

      2017-12-09 06:34:04.233638-0800 jlmj[5997:2882220] Compile options specified when Apple built the library:
      2017-12-09 06:34:04.236378-0800 jlmj[5997:2882220] BUG_COMPATIBLE_20160819
      2017-12-09 06:34:04.236490-0800 jlmj[5997:2882220] COMPILER=clang-9.0.0
      2017-12-09 06:34:04.236574-0800 jlmj[5997:2882220] DEFAULT_CACHE_SIZE=128
      2017-12-09 06:34:04.236651-0800 jlmj[5997:2882220] DEFAULT_CKPTFULLFSYNC
      2017-12-09 06:34:04.236727-0800 jlmj[5997:2882220] DEFAULT_JOURNAL_SIZE_LIMIT=32768
      2017-12-09 06:34:04.236803-0800 jlmj[5997:2882220] DEFAULT_PAGE_SIZE=4096
      2017-12-09 06:34:04.236968-0800 jlmj[5997:2882220] DEFAULT_SYNCHRONOUS=2
      2017-12-09 06:34:04.237046-0800 jlmj[5997:2882220] DEFAULT_WAL_SYNCHRONOUS=1
      2017-12-09 06:34:04.237121-0800 jlmj[5997:2882220] ENABLE_API_ARMOR
      2017-12-09 06:34:04.237195-0800 jlmj[5997:2882220] ENABLE_COLUMN_METADATA
      2017-12-09 06:34:04.237270-0800 jlmj[5997:2882220] ENABLE_DBSTAT_VTAB
      2017-12-09 06:34:04.237345-0800 jlmj[5997:2882220] ENABLE_FTS3
      2017-12-09 06:34:04.237421-0800 jlmj[5997:2882220] ENABLE_FTS3_PARENTHESIS
      2017-12-09 06:34:04.237497-0800 jlmj[5997:2882220] ENABLE_FTS3_TOKENIZER
      2017-12-09 06:34:04.237648-0800 jlmj[5997:2882220] ENABLE_FTS4
      2017-12-09 06:34:04.237726-0800 jlmj[5997:2882220] ENABLE_FTS5
      2017-12-09 06:34:04.237802-0800 jlmj[5997:2882220] ENABLE_JSON1
      2017-12-09 06:34:04.237876-0800 jlmj[5997:2882220] ENABLE_LOCKING_STYLE=1
      2017-12-09 06:34:04.237950-0800 jlmj[5997:2882220] ENABLE_PREUPDATE_HOOK
      2017-12-09 06:34:04.238023-0800 jlmj[5997:2882220] ENABLE_RTREE
      2017-12-09 06:34:04.238097-0800 jlmj[5997:2882220] ENABLE_SESSION
      2017-12-09 06:34:04.238172-0800 jlmj[5997:2882220] ENABLE_SNAPSHOT
      2017-12-09 06:34:04.238248-0800 jlmj[5997:2882220] ENABLE_SQLLOG
      2017-12-09 06:34:04.238323-0800 jlmj[5997:2882220] ENABLE_UNKNOWN_SQL_FUNCTION
      2017-12-09 06:34:04.238398-0800 jlmj[5997:2882220] ENABLE_UPDATE_DELETE_LIMIT
      2017-12-09 06:34:04.238473-0800 jlmj[5997:2882220] HAS_CODEC_RESTRICTED
      2017-12-09 06:34:04.238548-0800 jlmj[5997:2882220] HAVE_ISNAN
      2017-12-09 06:34:04.238622-0800 jlmj[5997:2882220] MAX_LENGTH=2147483645
      2017-12-09 06:34:04.238695-0800 jlmj[5997:2882220] MAX_MMAP_SIZE=20971520
      2017-12-09 06:34:04.242805-0800 jlmj[5997:2882220] MAX_VARIABLE_NUMBER=500000
      2017-12-09 06:34:04.242891-0800 jlmj[5997:2882220] OMIT_AUTORESET
      2017-12-09 06:34:04.242967-0800 jlmj[5997:2882220] OMIT_LOAD_EXTENSION
      2017-12-09 06:34:04.243045-0800 jlmj[5997:2882220] STMTJRNL_SPILL=131072
      2017-12-09 06:34:04.243120-0800 jlmj[5997:2882220] SUBSTR_COMPATIBILITY
      2017-12-09 06:34:04.243196-0800 jlmj[5997:2882220] THREADSAFE=2
      2017-12-09 06:34:04.243509-0800 jlmj[5997:2882220] USE_URI
      

      参考

      1. SQLite Compile-Time Options
      2. JSON SQLite Functions
      3. Pragma Compile Options

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多