Ответ 1
Два основных подхода:
-
Вы можете создать второй столбец в таблице, который содержит строку без международных символов. Кроме того, перед тем, как выполнять поиск по этому второму столбцу поиска, вы также должны удалить международные символы из строки поиска, тоже (таким образом, вы сравниваете не-международные с не-международными).
Это обычная программа, используемая для преобразования международных символов:
NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Вы также можете заменить акцентированные символы:
NSMutableString *mutableString = [string mutableCopy]; CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformStripCombiningMarks, NO);
Кстати, если вам нужно отсортировать результаты, вы можете также сортировать это вторичное поле поиска вместо основного поля, что позволит избежать проблем, связанных с невозможностью SQLite сортировать международные символы.
-
Вы также можете создать свою собственную "безударную" функцию C (определите эту функцию C вне
@implementation
для своего класса):void unaccented(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((__bridge CFMutableStringRef)string, NULL, kCFStringTransformStripCombiningMarks, NO); sqlite3_result_text(context, [string UTF8String], -1, SQLITE_TRANSIENT); } }
Затем вы можете определить функцию SQLite, которая вызовет эту C-функцию (вызовите этот метод после открытия базы данных, которая будет действовать до закрытия этой базы данных):
- (void)createUnaccentedFunction { if (sqlite3_create_function_v2(database, "unaccented", 1, SQLITE_ANY, NULL, &unaccented, NULL, NULL, NULL) != SQLITE_OK) NSLog(@"%s: sqlite3_create_function_v2 error: %s", __FUNCTION__, sqlite3_errmsg(database)); }
Сделав это, вы теперь можете использовать эту новую функцию
unaccented
в SQL, например:if (sqlite3_prepare_v2(database, "select a from table where unaccented(column) like 'a'", -1, &statement, NULL) != SQLITE_OK) NSLog(@"%s: insert 1: %s", __FUNCTION__, sqlite3_errmsg(database));