我想創建一個排序規則,以便不區分大小寫,並且不在數據庫中搜索重音。在iPhone上使用sqlite3_create_collation
這裏是我的代碼:
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)
則返回0而不是1,和我的自定義函數沒有被調用(我把斷點功能去測試)。
當我使用「PRAGMA collation_list」列出所有排序規則時,我的自定義排序規則存在。
任何想法的問題?
'stringWithCharacters:length:'期望一個'unichar'(又名UTF-16)字符串。您可能必須使用'initWithBytes:length:encoding:'並指定'NSUTF8StringEncoding'。 - 但是,如果沒有調用比較函數,這可能不會解決您的問題。 –
是的,對於「stringWithCharacters」我會使用「stringWithUTF8String」,這很簡單。像你說的那樣,這裏不是真正的問題:) – djleop
請注意'stringWithUTF8String'只能在字符串以NULL結尾時使用。您可能必須明確指定長度。 –