我试图通过忽略变音符号来提取存储在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
函数将值正确绑定到查询。如果值带有引号或其他特殊值,则使用stringWithFormat:
将失败。使用sqlite3_bind_xxx
函数可正确引用和转义值。关于ios - 我如何在忽略变音符号的SQLite中执行阿拉伯语搜索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20548083/