在iPhone上使用sqlite3_create_collat​​ion

时间:2013-02-04 14:22:00

标签: iphone objective-c sqlite accent-insensitive

我想创建一个排序规则,以便在数据库中不区分大小写,并且不会在数据库中进行重音搜索。

这是我的代码:

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”列出所有排序规则时,我的自定义排序规则就存在。

对这个问题有什么想法吗?

1 个答案:

答案 0 :(得分: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源代码中找到。