【发布时间】:2013-01-19 06:25:52
【问题描述】:
我想创建一个排序规则,以便在数据库中不区分大小写并且没有重音搜索。
这是我的代码:
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”,它更简单。就像你说的,这不是真正的问题:)
-
请注意,
stringWithUTF8String只能在字符串以 NULL 结尾的情况下使用。您可能必须明确指定长度。 -
你可以试试
SQLITE_UTF16而不是SQLITE_UTF8(和stringWithCharacters:length:在比较函数中)。
标签: iphone objective-c sqlite accent-insensitive