我正在尝试提取存储在我的 SQL Lite 数据库中的单词,忽略变音符号,但它总是返回一个空结果。我的数据库包含带有变音符号的阿拉伯语单词,我会使用不包含变音符号的单词进行搜索。
NSString *queryStatement = [[NSString alloc ]initWithFormat"SELECT ID,ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC,BEGINFRENCH,ISFAVORITE FROM DictionaryDB WHERE FRENCHINARABIC LIKE \"%%%@%%\"",searchedWord];
例如 searchedWord 可以是 @"أكل"并且可以带有变音符号 @"أَكَلَ"。
我该如何解决这个问题?
我通过创建自己的 SQLite 函数来解决这个问题。
基本思想是你的查询变成:
NSString *queryStatement = [[NSString alloc] initWithFormat"SELECT ID, ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC, BEGINFRENCH, ISFAVORITE FROM DictionaryDB WHERE contains(FRENCHINARABIC, '%@')", searchedWord];
contains
将是您的自定义函数。
首先你需要编写一个实现contains
SQL函数的C函数:
void contains(sqlite3_context *context, int argc, sqlite3_value **argv) {
BOOL res = NO;
if (argc < 2) {
res = NO;
} else {
char *textstr = (char *)sqlite3_value_text(argv[0]);
char *substr = (char *)sqlite3_value_text(argv[1]);
if (textstr && substr) {
NSString *text = [NSString stringWithCString:textstr encoding:NSUTF8StringEncoding];
NSString *sub = [NSString stringWithCString:substr encoding:NSUTF8StringEncoding];
// Adjust the options to suit your needs
NSRange range = [text rangeOfString:sub options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch];
if (range.location != NSNotFound) {
res = YES;
}
}
}
sqlite3_result_int(context, res ? 1 : 0);
}
当你打开你的数据库连接时,你需要注册这个函数:
// dbRef is your database reference
int res = sqlite3_create_function(dbRef, "contains", 2, SQLITE_UTF8, NULL, &contains, NULL, NULL);
if (res != SQLITE_OK) {
NSAssert1(0, @"Error: failed to create function in the database: '%s'.", sqlite3_errmsg(dbRef));
}
旁注 - 使用 stringWithFormat:
来创建查询是个坏主意。您真的应该考虑使用 sqlite3_bind_xxx
函数将值正确绑定(bind)到查询。如果值包含任何引号或其他特殊值,则使用 stringWithFormat:
将失败。使用 sqlite3_bind_xxx
函数可以正确地引用和转义值。
关于ios - 我如何在 SQLite 中执行阿拉伯语搜索而忽略变音符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20548083/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |