2013-12-12 3 views
2

Я пытаюсь извлечь слова, которые хранятся в моей базе данных SQL Lite с игнорированием диакритики, но всегда возвращает пустой результат. моя база данных содержит арабские слова с диакритикой, и я бы сделал поиск со словами, которые не содержат диакритики.Как выполнить арабский поиск в SQL Lite, игнорируя диакритические знаки?

NSString *queryStatement = [[NSString alloc ]initWithFormat:@"SELECT ID,ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC,BEGINFRENCH,ISFAVORITE FROM DictionaryDB WHERE FRENCHINARABIC LIKE \"%%%@%%\"",searchedWord]; 

Например searchedWord может быть @ "أكل" и может быть с диакритическими знаками @ "أكل".

Как я могу решить эту проблему?

ответ

1

Я решил такую ​​вещь, создав свою собственную функцию SQLite, которая делает это.

Основная идея ваш запрос становится:

NSString *queryStatement = [[NSString alloc] initWithFormat:@"SELECT ID, ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC, BEGINFRENCH, ISFAVORITE FROM DictionaryDB WHERE contains(FRENCHINARABIC, '%@')", searchedWord]; 

где contains будет ваша пользовательская функция.

Прежде всего, необходимо написать функцию C, которая реализует функцию contains SQL:

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 обеспечивает правильное цитирование и ускорение значений.

0

Я решил проблему, заменив диакритические здесь мой правильный запрос @"SELECT ID,ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC,BEGINFRENCH,ISFAVORITE FROM DictionaryDB WHERE replace(replace(replace(replace(replace(replace(replace (replace(ARABICMEANING, 'ِ', ''),'ٍ',''),'ْ',''),'ّ',''),'ٌ',''),'ُ',''),'ً',''),'َ','')LIKE \"%%%@%%\"",@"أكل"];

+1

это очень некрасиво и не очень масштабируемым. Вы должны рассмотреть мое решение. – rmaddy

Смежные вопросы