具有SQLITE FTS3 Xcode发布版本的iPhone应用程序无法运行

具有SQLITE FTS3 Xcode发布版本的iPhone应用程序无法运行,iphone,xcode,sqlite,release,fts3,Iphone,Xcode,Sqlite,Release,Fts3,我的iPhone应用程序使用SQLITE的FTS3函数(特别是匹配和偏移)。这些是我的优化搜索算法所必需的。我通过在项目中的一个名为SQLITE的组下包含三个SQLITE源文件(即sqlite3.c、sqlite3.h和sqlite3ext.h)来实现FTS3。我从框架组中删除了我以前对libsqlite3.dylib库的引用。我将“其他C标志”和“其他C++标志”项目设置设置为-dqLeTeEnabeLyft3=1。(我还尝试简单地将这些标志设置为-DSQLITE_ENABLE_FTS3。)

我的iPhone应用程序使用SQLITE的FTS3函数(特别是匹配和偏移)。这些是我的优化搜索算法所必需的。我通过在项目中的一个名为SQLITE的组下包含三个SQLITE源文件(即sqlite3.c、sqlite3.h和sqlite3ext.h)来实现FTS3。我从框架组中删除了我以前对libsqlite3.dylib库的引用。我将“其他C标志”和“其他C++标志”项目设置设置为-dqLeTeEnabeLyft3=1。(我还尝试简单地将这些标志设置为-DSQLITE_ENABLE_FTS3。)

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

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


我迫切需要一个解决方案,因此任何想法都将受到极大的赞赏。

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


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

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

请注意,如果您只使用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 [数据库]编译选项:

启用\u FTS3

启用\u FTS3\u括号

启用锁定样式=1

启用树

省略内置测试

省略加载扩展名

温度存储=1

线程安全=2

这是根据iOS 4.3.5编译的。我可以确认fts3虚拟表和MATCH关键字在我的构建中正常工作

此答案与其他答案的不同之处如下:

  • 突出显示由提供的有用代码
  • 显示Xcode 9/Swift 4.0.3的完整代码和输出
  • 注意,可以在iOS中识别SQLite的有用特性(例如)
tldr

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
参考


  • 谢谢你的回复。我现在才意识到我的问题与fts3和sqlite无关。但是,您的回答确实告诉了我原始日志文件在哪里,我对它们进行了比较。我从那次练习中学到了很多。然而,我的问题是CellForRowatineXpath没有在设备发布版本中被调用,而是在设备调试版本和模拟器发布版本中被调用!这就是问题所在。我正在研究和调试,但还没有成功。尽管代码是相同的,但是为什么行为是不同的呢?这是一篇关于调试/检查sqllite设置的非常有用的文章。谢谢