5

私は現在、全文検索を行う IOS アプリに取り組んでいます。検索は sqlite データベースで select ステートメントを実行することによって実行されますが、問題は、データベース内の値の多くにスカンジナビア文字 (Æ、Ö、Á など) が含まれており、16 進値を取得せずにステートメントを変換するのに問題があることです。文字のために。

これが私が現在行っていることです:

 const char *sql = [[NSString stringWithFormat:
                     @"SELECT %@\
                     FROM Customer c\
                     JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\
                     WHERE cm.Name LIKE '%%%@%%'\
                     ORDER BY cm.Name", kCustomerSelect, searchString] UTF8String];  

ここで、kCustomerSelect は選択する列を含む定数であり、searchString はユーザー入力を含みます。

これは通常のラテン文字の魅力のように機能しますが、たとえば Ö を searchString として渡すと、st\xc3\xb6 が得られます。UTF8 でエンコードされた文字列を単にログアウトしても、文字列が正しく表現されないことは承知していますが、問題は、select ステートメントで結果が得られないことです。

クエリを実行する前に sqlite3_open() を呼び出しています。SQLite のドキュメントから *"データベースのデフォルトのエンコーディングは、sqlite3_open() または sqlite3_open_v2() が呼び出された場合は UTF-8 になり、sqlite3_open16 の場合はネイティブ バイト オーダーで UTF-16 になります。 () 使用されている。"*。

さまざまなエンコーディングに置き換えUTF8StringcStringUsingEncoding:試してみることで、さまざまなエンコーディングを使用してみました。それらのどれも機能していません (期待していたわけではありませんが、少なくとも試してみたかったのです)。

すべてのヘルプ、またはヒントをいただければ幸いです。

編集 SQLite Database Browser を使用して、データベースで同じ select ステートメントを実行しようとしましたが、結果が得られません。これは、FTS3 を使用して Customer_Metadata テーブルを作成したことと関係があるのではないかと考えさせられます。

MrDresden

4

2 に答える 2

0

FTS3を使用している場合、デフォルトのトークナイザーは希望どおりに機能しません。

FTSテーブルの作成に使用されるCREATEVIRTUALTABLEステートメントの一部として特定のトークナイザーが指定されていない限り、デフォルトのトークナイザー「simple」が使用されます。単純なトークナイザーは、次のルールに従って、ドキュメントまたは基本的なFTSフルテキストクエリからトークンを抽出します。

用語は、適格な文字の連続したシーケンスであり、適格な文字はすべて英数字であり、Unicodeコードポイント値が128以上のすべての文字です。他のすべての文字は、ドキュメントを用語に分割するときに破棄されます。それらの唯一の貢献は、隣接する用語を分離することです。

-http ://www.sqlite.org/fts3.html#tokenizer

カスタムトークナイザーを使用するか、icuまたはunicode61トークナイザーが機能するかどうかを確認する必要があります。それらに関する情報は、上記のリンクされたドキュメントにあります。

于 2012-10-31T16:49:21.473 に答える
0

次のようにクエリを記述します。

const char *sql = [[NSString stringWithFormat:
                 @"SELECT %@\
                 FROM Customer c\
                 JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\
                 WHERE cm.Name LIKE ?\
                 ORDER BY cm.Name", kCustomerSelect] UTF8String];

ステートメントを準備したら、searchString をバインドします。

sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%%%@%%", searchString] UTF8String], -1, SQLITE_TRANSIENT);

データベースが UTF-8 である限り、ギリシャ語、ロシア語、日本語、そしてもちろんさまざまなスカンジナビア文字を使用してテキストを入力できます。

編集:あなたの編集を見ました。データが適切に作成されていない場合、それは確かに問題になります。

于 2012-10-31T16:33:18.157 に答える