首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iPhone上使用sqlite3_create_collation

在iPhone上使用sqlite3_create_collation
EN

Stack Overflow用户
提问于 2013-02-04 22:22:00
回答 1查看 1.7K关注 0票数 2

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

下面是我的代码:

代码语言:javascript
复制
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);
}

当我执行此查询时:

代码语言:javascript
复制
SELECT ('teste' LIKE 'testé' COLLATE MYNOCASENOACCENT)

它返回0而不是1,并且我的自定义函数永远不会被调用(我将断点放在函数中进行测试)。

当我使用"PRAGMA collation_list“列出所有排序规则时,我的自定义排序规则就存在了。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-05 18:46:53

这可能太晚了,因此只需简短地:

您定义了排序规则函数。将用于比较指定了该排序规则的表列。如你所见,它不会应用于like运算符。

您需要做的是定义和注册一个类似的函数,例如

代码语言:javascript
复制
static void utf8likeFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    //...
}

sqlite3_create_function(db, "like", 2, SQLITE_UTF8, (void*)&likeInfoNorm, utf8likeFunc, 0, 0);

示例like函数可以在sqlite源代码中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14688695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档