iOS用のMonotouchを使用してSQLiteでFTSを使用する方法
-
27-10-2019 - |
質問
私は、テキストでいっぱいのかなり大きなSQLite DBを備えたMonotouchを使用してiOSアプリを構築しようとしています。このテキストを迅速に検索する必要があります。
今の私の最良の解決策は、FTSモジュール(できればバージョン4)です。 iOS上のSQLiteのデフォルトインスタンスはFTSをサポートしていないことを読みました。これが本当なら、Monotouchを使用してSQLiteのカスタムインスタンスを構築する推奨方法は何ですか?それともこれはまったくできますか?
このサイトは、Xcodeでこれを達成する方法を説明していることを発見しましたが、Monotouchでどのように達成するかは明確ではありません。
http://longweekendmobile.com/2010/06/16/sqlite-full-text-search-for-iphone-ipadyour-own-sqlite-for-iphone-and-ipad/
どんな助けも大歓迎です!
解決
あなたは同じことをして、独自のlibsqlite3.aを構築し、すべての公開輸出をマングルする必要があります。そうすれば、システムによってロードされたlibsqliteと競合しないでください。 libsqliteの代わりに[dllimport( "__internal")]から[dllimport( "__internal")]へ。
他のヒント
上記のコメントで述べたように、私はこれを機能させました、そして、Stack Overflowが本当に私を助けてくれたので、私はコミュニティに恩返しをするために少し貢献したいと思いました。
免責事項
これは、iOS/macos/xcode/monotouchに関しては、N00Bの.NET開発者から来ています。
iPadシミュレーターでこれをテストしましたが、実際のデバイスでまだテストしていません。
免責事項を終了します
これは、独自のバージョンのSQLiteを迅速にコンパイルし、フルテキスト検索をサポートすることを目的としてMonotouchプロジェクトに含める方法です。
ステップ1:SQLite Amalgamationファイルをダウンロードします。
これには、1つのファイルにすべてのsqliteが含まれます。
http://www.sqlite.org/download.html
ステップ2:iOS用のXcodeのSQLiteソースをコンパイルします。
ここでこれを行う方法についての良いウォークスルーがあります:
http://pp.hillrippers.ch/blog/2009/08/08/static+sqlite+library+ with+unicode+support+for+the+fone/
ステップ1-5に従って、ヘッダーを追加していないため、#6をスキップしました。
ウォークスルーで使用されているコンパイルフラグを使用する代わりに、使用しました。
sqlite_enable_column_metadata
sqlite_enable_fts4
追加したい他の人もいるかもしれません。
これらのコンパイルフラグは、Xcodeに追加され、「Preprocessor Macros」という下のプロジェクトの「ビルド」タブに追加されます。
これをコンパイルしたら、「mylibrary.a」が必要です。
ステップ3:このファイルをMonoDevelopプロジェクトに含める
myLibrary.aを他のファイルと同様にモデルベロビングに追加し、それを右クリックして、ビルドアクションが「何もない」ことを確認します。
プロジェクトオプションで「iPhoneビルド」を選択します。追加のmtouch引数を追加する必要があります。以下を追加します
-gcc_flags "-L${ProjectDir} -lmylibrary -force_load ${ProjectDir}/mylibrary.a"
ステップ4:AC#ラッパーを構築します
おそらくこの時点で含める良いラッパーを見つけることができますが、私はすぐに自分のものを転がしました。
c#でsqliteラッパーを作成するための優れたチュートリアルについては、このページを確認してください。
http://www.switchonthecode.com/tutorials/csharp-tutorial-writing-a-dotnet-wrapper-for-sqlite
ライブラリはプロジェクトの一部であるため、名前でライブラリを参照する必要はありませんが、代わりに「__internal」キーワードを使用します。 *「__internal」には2つのアンダースコアがあります *(気付く前にどれくらいの時間を無駄にしたかを聞かないでください)
これが私の1つのサンプルです
[DllImport ("__Internal", EntryPoint="sqlite3_open")]
static extern int sqlite3_open_v2(string filename, out IntPtr db);
ラッパーをまとめることには明らかに多くのことがありますが、それを行う方法についてはたくさんの情報があります。 Gotchaの1つは、SQLiteから返された弦を適切にマーシャリングすることです。 (見る http://blog.gebhardtcomputing.com/2007/11/marshal-utf8-strings-in-net.html マーシャリングの詳細については)
これは、ネイティブライブラリをMonodevelop/Monotouchにコンパイルすることを迅速にウォークスルーにすることを目的としていました。それが誰かに役立つことを願っています。