我试图通过忽略变音符号来提取存储在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/

10-11 03:17