2

大文字と小文字を区別せず、データベースでアクセントなしの検索を行うために、照合を作成したいと考えています。

ここに私のコードがあります:

static int sqlite3NoCaseNoAccentCollate(void * foo, int ll, const void *l, int rl,
                         const void *r){
    NSLog(@"comparing");
    NSString *left = [NSString stringWithCharacters:l length:ll];
    NSString *right = [NSString stringWithCharacters:r length:rl];
    NSComparisonResult rs = [left compare:right options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch|NSForcedOrderingSearch];

    NSLog("%d",rs);
    return rs;
}


sqlite3 *db;
if (SQLITE_OK==sqlite3_open([pathToDataBase UTF8String], &db)){
    sqlite3_create_collation(db, "MYNOCASENOACCENT", SQLITE_UTF8, NULL, &sqlite3NoCaseNoAccentCollate);
}

このクエリを実行すると:

SELECT ('teste' LIKE 'testé' COLLATE MYNOCASENOACCENT)

1 ではなく 0 を返し、カスタム関数が呼び出されることはありません (関数にブレークポイントを設定してテストします)。

「PRAGMA collat​​ion_list」を使用してすべての照合を一覧表示すると、カスタム照合が存在します。

問題のアイデアはありますか?

4

1 に答える 1

0

手遅れかもしれないので、簡単に:

照合関数を定義しました。その照合が指定されているテーブル列を比較するために使用されます。ご覧のとおり、like 演算子には適用されません。

あなたがする必要があるのは、例えばlike関数を定義して登録することです

static void utf8likeFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    //...
}

sqlite3_create_function(db, "like", 2, SQLITE_UTF8, (void*)&likeInfoNorm, utf8likeFunc, 0, 0);

関数のようなサンプルは、sqlite ソースにあります。

于 2013-09-05T10:46:53.187 に答える