我正在尝试根据在SO和其他地方找到的各种示例来组合解决方案。
我有一个SQLite数据库,其中的一列带有重音字符串,即église
。我要搜索eglise
匹配项église
。
我在实现之外有一个用户定义的函数:
void withoutDiacritics(sqlite3_context *context, int argc, sqlite3_value **argv)
{
if (argc != 1 || sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
sqlite3_result_null(context);
return;
}
@autoreleasepool {
NSMutableString *string = [NSMutableString stringWithUTF8String:(const char *)sqlite3_value_text(argv[0])];
CFStringTransform((CFMutableStringRef)string, NULL, kCFStringTransformStripCombiningMarks, NO);
sqlite3_result_text(context, [string UTF8String], -1, SQLITE_TRANSIENT);
}
}
在查询之前,我创建函数:
sqlite3_create_function_v2(db, "WithoutDiacritics", 1, SQLITE_ANY, NULL, &withoutDiacritics, NULL, NULL, NULL);
最后,我查询一个FTS3虚拟表:
SELECT * FROM vTerms WHERE WithoutDiacritics(MasterField) MATCH '*eglise*'
不幸的是,即使eglise
表中没有任何重音符号,也不会返回任何内容。
如何将我的函数应用于数据库列?
PS我已经探讨了备份的可能性,其中包括不带变音符号的列即可进行快速搜索。它运作良好,但是较大的数据库大小使我超出了iOS App Store的100mb下载限制。
FTS表不使用归类;您需要使用其他标记符,例如ICU或UNICODE61,或编写自定义标记符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句