1

ここで SO について多くの質問をしましたが (このようなもの)、まだ支援が必要です。

スロベニア語のアルファベット順に並べ替えるには、sqlite select が必要です (文字 č は c の後に、文字 š は s の後に、文字 ž は z の後に来ます)。

私が使用するコードは次のとおりです。

static int sqlite3SloCollate(void * foo, int ll, const void *l, int rl,
                                        const void *r){
    NSString *left = [NSString stringWithCharacters:l length:ll];
    NSString *right = [NSString stringWithCharacters:r length:rl];
    //THIS IS WHERE I DON'T KNOW HOW TO COMPARE CHARACTERS
    NSComparisonResult rs = [left compare:right options:NSForcedOrderingSearch];

    return rs;
}

sqlite3_create_collation(database, "SLOCOLLATE", SQLITE_UTF8, NULL, &sqlite3SloCollate);

querySQL = [NSString stringWithFormat: @"SELECT s.id FROM lyrics l INNER JOIN song s ON (l.idSong=s.id) WHERE content LIKE '%%%@%%' GROUP BY s.id ORDER BY s.title COLLATE SLOCOLLATE;",searchString];

どの NSOrdering タイプを使用すればよいですか? または、独自の比較関数を作成する必要がありますか (例を教えてください)。

4

2 に答える 2

1

この機能が役立つと思います:

- (NSComparisonResult)compare:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)range locale:(id)locale

( Apple のドキュメントから)。

次を使用してロケールを作成できます。

- (id)initWithLocaleIdentifier:(NSString *)string

( Apple NSLocale Class Documentationから)。

このコードはトリックを行う必要があります:

NSRange range = NSMakeRange(0, [left length]);
id locale = [[NSLocale alloc] initWithLocaleIdentifier:@"sl_SI"];
NSComparisonResult rs = [left compare:right options:NSForcedOrderingSearch range:range locale:locale];

これが役立つことを願っています。

于 2013-05-29T07:33:52.240 に答える
1

@DCMaxxx の回答にはそのほとんどが含まれています。さらに、使用する必要があるコメントstringWithUTF8String。しかし、さらにいくつかの問題があります。

1)stringWithUTF8Stringヌルで終了する c-string を使用しますが、sqlite は長さだけでヌル終了のない文字列を提供します。

2) 比較する文字数は、左の長さだけでなく、最も短い長さを取る必要があります。

3) 比較が等しい場合、どちらの文字列が長いかを考慮する必要があります。

完全なコードはこちら。NSMutableData オブジェクトを使用して、長さのコード化された文字列を null で終了する文字列に変換します。あなたがそのように傾倒しているなら、ストレートなCコードでそれを行う方がおそらく速くて簡単です。

static int sqlite3SloCollate(void * foo, int ll, const void *l, int rl,
                             const void *r){
    NSMutableData* ld = [NSMutableData dataWithBytes:l length:ll+1];
    [ld resetBytesInRange:NSMakeRange(ll, 1)];
    NSString *left = [NSString stringWithUTF8String:[ld bytes]];

    NSMutableData* rd = [NSMutableData dataWithBytes:r length:rl+1];
    [rd resetBytesInRange:NSMakeRange(rl, 1)];    
    NSString *right = [NSString stringWithUTF8String:[rd bytes]];

    NSRange range = NSMakeRange(0, MIN([left length],[right length]));
    id locale = [[NSLocale alloc] initWithLocaleIdentifier:@"sl_SI"];
    NSComparisonResult result = [left compare:right options:0 range:range locale:locale];

    if (result==NSOrderedSame) {
        if (ll>rl) {
            result = NSOrderedDescending;
        } else if (ll<rl) {
            result = NSOrderedAscending;
        }
    }    
    // NSLog(@"Comparison:%@ - %@ - %li",left,right,(long)result);
    return result;
}
于 2014-07-31T18:15:45.633 に答える