Как использовать FTS в SQLite с Monotouch для iOS - PullRequest
1 голос
/ 21 марта 2011

Я собираюсь создать приложение для iOS с использованием Monotouch, которое имеет довольно большой sqlite db, полный текста. Мне нужно обеспечить быстрый поиск по этому тексту.

Моим лучшим решением сейчас является модуль FTS (желательно версия 4). Я прочитал, что экземпляр sqlite по умолчанию на iOS не поддерживает FTS. Если это так, каков рекомендуемый способ создания пользовательского экземпляра sqlite с помощью Monotouch? Или это вообще можно сделать?

Я нашел этот сайт, описывающий, как это сделать с помощью xcode, но не ясно, как мне это сделать с Monotouch.
http://longweekendmobile.com/2010/06/16/sqlite-full-text-search-for-iphone-ipadyour-own-sqlite-for-iphone-and-ipad/

Любая помощь очень ценится!

Ответы [ 2 ]

5 голосов
/ 09 апреля 2011

Как я уже упоминал в моем комментарии выше, я получил эту работу, и, так как переполнение стека действительно помогло мне, я хотел внести небольшой вклад в развитие сообщества.
Ответственность
Это исходит от разработчика .NET, который является N00B, когда дело доходит до iOS / MacOS / XCode / Monotouch.
Несмотря на то, что я тестировал это на симуляторе iPad, мне еще предстоит протестировать его на реальном устройстве.
Конечный отказ от ответственности

Это краткое руководство по компиляции собственной версии SQLite и ее включению в проект Monotouch с целью поддержки полнотекстового поиска.

Шаг 1: Загрузите файл объединения SQLite.

Сюда входит весь SQLite в одном файле.
http://www.sqlite.org/download.html

Шаг 2. Скомпилируйте исходный код SQLite в Xcode для iOS.

Здесь есть хорошее руководство по тому, как это сделать:
http://pp.hillrippers.ch/blog/2009/08/08/Static+SQLite+Library+with+Unicode+Support+for+the+iPhone/

Я выполнил шаги 1-5, пропустил # 6, поскольку мы не добавляем дополнительные заголовки.

Вместо использования флагов компиляции, используемых в пошаговом руководстве, я использовал:
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS4

Возможно, вы захотите добавить и других.
Эти флаги компиляции добавляются в XCode на вкладку «Сборка» проекта в разделе «Макросы препроцессора».

После того, как вы скомпилировали это, вы должны иметь «mylibrary.a».

Шаг 3: Включите этот файл в ваш проект MonoDevelop
Добавьте mylibrary.a в MonoDevelop, как и любой другой файл, щелкните по нему правой кнопкой мыши и убедитесь, что действие по сборке - «Ничего».

В опциях вашего проекта выберите «Сборка iPhone». Вам нужно добавить дополнительные аргументы mtouch. Добавить следующее

-gcc_flags "-L${ProjectDir} -lmylibrary -force_load ${ProjectDir}/mylibrary.a"

Шаг 4: создание оболочки c #
Возможно, вы могли бы найти хорошую обертку для включения в этот момент, но я просто быстро свернул свою собственную.

Для хорошего руководства по написанию оболочки SQLite на C # посмотрите эту страницу:
http://www.switchonthecode.com/tutorials/csharp-tutorial-writing-a-dotnet-wrapper-for-sqlite

Поскольку ваша библиотека является частью проекта, вам не нужно ссылаться на библиотеку по имени, вместо этого используйте ключевое слово "__Internal". * ВНИМАНИЕ В "__INTERNAL" ДВА ПОДПИСЫВАЮТСЯ * (не спрашивайте меня, сколько времени я потратил впустую, прежде чем понял это)

Вот образец одного из моих

[DllImport ("__Internal", EntryPoint="sqlite3_open")]  
static extern int sqlite3_open_v2(string filename, out IntPtr db);

Очевидно, что собрать обертку гораздо больше, но есть много информации о том, как это сделать. Один из способов - правильно распределить строки, возвращаемые из SQLite. (см. http://blog.gebhardtcomputing.com/2007/11/marshal-utf8-strings-in-net.html для получения дополнительной информации о маршалинге)

Это было задумано как быстрое пошаговое руководство по сборке встроенной библиотеки в MonoDevelop / monotouch, и я надеюсь, что это кому-нибудь поможет.

0 голосов
/ 21 марта 2011

Вы должны сделать то же самое, создать свой собственный libsqlite3.a и манипулировать всем общедоступным экспортом, чтобы он не конфликтовал с libsqlite, загруженным системой, и тогда вам нужно будет изменить любую библиотеку, которую вы хотите привязать к sqlite к [DllImport ("__Internal")] вместо libsqlite.

...