2013-02-04 64 views
2

我想創建一個排序規則,以便不區分大小寫,並且不在數據庫中搜索重音。在iPhone上使用sqlite3_create_collat​​ion

這裏是我的代碼:

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 collat​​ion_list」列出所有排序規則時,我的自定義排序規則存在。

任何想法的問題?

+0

'stringWithCharacters:length:'期望一個'unichar'(又名UTF-16)字符串。您可能必須使用'initWithBytes:length:encoding:'並指定'NSUTF8StringEncoding'。 - 但是,如果沒有調用比較函數,這可能不會解決您的問題。 –

+0

是的,對於「stringWithCharacters」我會使用「stringWithUTF8String」,這很簡單。像你說的那樣,這裏不是真正的問題:) – djleop

+0

請注意'stringWithUTF8String'只能在字符串以NULL結尾時使用。您可能必須明確指定長度。 –

回答

0

它可能太晚了,因此只是簡單地說:

您定義了歸類函數。將用於比較指定排序規則的表列。正如你所看到的,它不會像運營商那樣申請。

你需要做的是定義並註冊一個類似的功能,例如

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的來源中找到。

+0

我驗證此答案,因爲我相信它,但我沒有時間去測試它。 感謝這個解決方案,我會稍後再研究它。 – djleop