2

私の iPhone アプリケーションは、SQLITE の FTS3 関数 (具体的には MATCH と OFFSET) を使用しています。これらは、最適化された検索アルゴリズムにとって不可欠です。3 つの SQLITE ソース ファイル、つまり sqlite3.c、sqlite3.h、および sqlite3ext.h をプロジェクトに SQLite という名前のグループの下に含めることで、FTS3 を実装しました。以前の libsqlite3.dylib ライブラリへの参照を Frameworks グループから削除しました。「その他の 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

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 [データベース] コンパイル オプション:

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 に答える
2

OK、私の風変わりな経験から恩恵を受けるかもしれない人のために、ここに解決策があります. 何度も髪を引っ張った後、リリース バージョンの最適化の一部を緩和することにしました。解決策としてではなく、問題に関する別の手がかりを得るためにこれを行いました。案の定、コードは完全に機能しました。それから、「OK、最適化を最小かつ最速に戻して、調査を続けましょう」と言いました。魔法のように、すべてがまだ機能していました!!! 要約すると、私が行った唯一のことは、プロジェクト設定で最適化を変更してから元に戻すことでした! もちろん、これはすべて、多くのデバッグ、すべてのターゲットのクリーニング後の再コンパイルなどの後で行われました。最適化を変更して元の値にリセットするまで、何も違いはありませんでした。クレイジーですが、それは私の話であり、私はそれに固執しています.

于 2010-02-21T02:48:24.933 に答える
0

私が最初にすることは、iPhoneリリースビルドのクリーンビルドを作成し、生のビルドログを詳細に確認することです。そこで実行される実際のコマンドを調べて、それらの追加のコンパイラ/プリプロセッサフ​​ラグが実際にそのターゲットに使用されるように構成されているかどうかを確認できます。

そうでない場合は、ターゲット設定を間違えた可能性があります。

于 2010-02-15T16:33:25.717 に答える