Приложение для iPhone с SQLITE FTS3 Xcode Build не работает - PullRequest
2 голосов
/ 15 февраля 2010

Приложение для моего iPhone использует функции SQLITE FTS3 (в частности, MATCH и OFFSET). Это важно для моего оптимизированного алгоритма поиска. Я реализовал FTS3, включив в свой проект три исходных файла SQLITE, а именно sqlite3.c, sqlite3.h и sqlite3ext.h, в группу под названием SQLite. Я удалил из группы Frameworks мою предыдущую ссылку на библиотеку libsqlite3.dylib. Я установил параметры проекта «Другие флаги C» и «Другие флаги C ++» на -DSQLITE_ENABLE_FTS3 = 1. (Я также попытался просто установить эти флаги в -DSQLITE_ENABLE_FTS3.)

Приложение отлично работает в симуляторе как для отладочной, так и для релизной сборок. Приложение также отлично работает на iPhone, НО только для отладочной сборки!

Сборка выпуска не возвращает строки результатов для каких-либо вызовов SQL с использованием ключевых слов MATCH и OFFSET. Мой конкретный вопрос: «Когда я собираю версию выпуска с подключенным iPhone, разве моя версия SQLITE с поддержкой FTS3 не устанавливается вместе с моим приложением?» Я вижу объектный файл sqlite.o в соответствующей подпапке Release-iphoneos на моем Mac. Это немного меньше, чем в подпапке Debug-iphoneos, но я пришел к выводу, что это связано с отсутствием символов отладки.

Я отчаянно нуждаюсь в решении, поэтому любые идеи будут высоко оценены.

Ответы [ 4 ]

2 голосов
/ 21 февраля 2010

ОК, для тех, кто может извлечь выгоду из моего необычного опыта, вот решение. После долгих усилий я решил немного оптимизировать релиз-версию. Я сделал это просто для того, чтобы получить другую подсказку о проблеме, а не как решение. Конечно же, код работал отлично! Затем я сказал: «Хорошо, позвольте мне вернуться к самой маленькой и самой быстрой оптимизации, чтобы продолжить расследование». Волшебно, все еще работало !!! Таким образом, единственное, что я сделал, - это изменил оптимизацию в настройках проекта, а затем вернул ее обратно! Все это, конечно, было после большой отладки, перекомпиляции после очистки всех целей и т. Д. НИЧЕГО не изменилось, пока я не изменил и не сбросил оптимизацию до первоначального значения. Сумасшедший, но это моя история, и я придерживаюсь ее. Надеюсь, это поможет кому-то другому, столкнувшемуся с этой проблемой.

2 голосов
/ 26 августа 2011

Просто обратите внимание, что если вы используете только fts3, вы можете просто использовать обычную библиотеку sqlite3, которая поставляется с SDK.Если вы выполните следующее:

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

THREADSAFE = 2

Это компиляция для iOS 4.3.5.Я могу подтвердить, что в моей сборке работают виртуальные таблицы fts3 и ключевое слово MATCH.

0 голосов
/ 09 декабря 2017

Этот ответ отличается от других следующими способами:

  • Подсвечивает полезный код, предоставленный @ Robert Hawkey
  • Показывает полный код и вывод для Xcode 9 / Swift 4.0.3
  • Отмечает, что можно определить полезные функции SQLite в iOS (например, Функции SQL JSON )

tldr;

PRAGMA compile_options; ( больше на прагме )

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
  2. Функции JSON SQLite
  3. Параметры компиляции Pragma
0 голосов
/ 15 февраля 2010

Первое, что я хотел бы сделать, - это сделать чистую сборку релизной сборки iPhone и детально изучить журнал необработанных сборок. Вы можете посмотреть на фактические команды, выполняемые там, чтобы увидеть, действительно ли эти дополнительные флаги компилятора / препроцессора сконфигурированы для использования для этой цели.

Если это не так, вы, вероятно, допустили ошибку в настройках Target.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...