2

我的 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 子文件夹中的要小一些,但我认为这是由于缺少调试符号。

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

4

4 回答 4

2

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

于 2010-02-21T02:48:24.933 回答
2

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

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 关键字在我的构建中工作。

于 2011-08-26T19:33:53.847 回答
0

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

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

于 2010-02-15T16:33:25.717 回答
-1

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

tldr;

PRAGMA 编译选项;(更多关于编译指示

斯威夫特 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 编译时选项
  2. JSON SQLite 函数
  3. Pragma 编译选项
于 2017-12-09T14:57:56.430 回答