Apple теперь включила FTS в стандартной/встроенной библиотеке sqlite?

Я хочу использовать FTS в своем проекте iOS. Через некоторые ответы на вопросы здесь, на SO (например, this) и другие источники (например, this), я понял, что мне придется развернуть собственную сборку sqlite3 на iOS, таким образом заменив зависимость на libsqlite3.dylib по умолчанию.

Но когда я напрямую запускаю запрос (в новом проекте, только со стандартной ссылкой libsqlite3.dylib и без пользовательской сборки sqlite):

"SELECT rowid FROM pages WHERE textcontent MATCH 'jim';" 

на страницах таблицы, созданных с помощью запроса:

"CREATE VIRTUAL TABLE pages USING fts3(textcontent TEXT)", 

Я не получаю никаких ошибок, вместо этого я получаю правильный результат (rowid строк, в которых существует слово «джим»), как будто FTS включен по умолчанию во встроенной библиотеке iOS sqlite.

Так ли это? Apple теперь включила FTS в стандартной/встроенной библиотеке sqlite? Или есть что-то, чего мне здесь не хватает?

Спасибо.

PS. Я использую FMDB в своем проекте в качестве оболочки sqlite, и вот код, который я использую для проверки вышеизложенного.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ,      NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbDocumentsPath = [documentsDir stringByAppendingPathComponent:@"1.db"];

FMDatabase *db = [FMDatabase databaseWithPath:dbDocumentsPath];

if (![db open])
    NSLog(@"Could not open db.");

if([db executeUpdate:@"CREATE VIRTUAL TABLE pages USING fts3(textcontent TEXT)"])
    NSLog(@"Virtual Table Created");

if([db executeUpdate:@"INSERT INTO pages(textcontent) VALUES ('Jack')"])
    NSLog(@"First Insert Done");
if([db executeUpdate:@"INSERT INTO pages(textcontent) VALUES ('jim is jam')"])
    NSLog(@"Second Insert Done");

FMResultSet* resultSet1 = [db executeQuery:@"SELECT rowid FROM pages WHERE textcontent MATCH 'jim';"];

while([resultSet1 next])
    NSLog(@"%@",[resultSet1 objectForColumnName:@"rowid"]);

person archeopetrix    schedule 09.01.2012    source источник
comment
Хорошо, как я уже сказал, я не получил никаких ошибок при попытке запросов FTS к libsqlite3.dylib, скомпилированному Apple, но когда я заменю его нашей собственной скомпилированной статической библиотекой sqlite с отключенной FTS вручную (путем удаления макроса #define SQLITE_ENABLE_FTS3 из sqlite .c), я получаю следующую ошибку: Ошибка при вызове sqlite3_step (1: нет такого модуля: fts3) SQLITE_ERROR. И когда я снова вручную включаю FTS, добавляя макрос #define SQLITE_ENABLE_FTS3 из sqlite.c, ошибка исчезает, и я получаю желаемый результат. Это заставляет меня еще больше поверить, что Apple по умолчанию включила FTS. Спасибо.   -  person archeopetrix    schedule 09.01.2012
comment
Какую версию iOS вы используете?   -  person SK9    schedule 31.01.2012


Ответы (2)


Этот парень подтверждает ваши выводы, утверждая в своем второе обновление блога о том, что FTS3 включен в библиотеку SQLite iOS 5. (Я также проверил это и пришел к тому же выводу.)

person fumoboy007    schedule 30.01.2013

Я протестировал это на своей машине и ОС Lion, и она работала отлично, однако сборка не выполняла FTS на любой другой машине (все запросы работали, кроме FTS). Тот же проект, построенный с ОС Leopard, не приведет к использованию FTS.
Но удаление источника объединения в проекте (и включение FTS) приводит к тому, что объединение создается и работает на любой машине.

person M Holod    schedule 19.04.2012