Я решил такую вещь, создав свою собственную функцию 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
обеспечивает правильное цитирование и ускорение значений.
это очень некрасиво и не очень масштабируемым. Вы должны рассмотреть мое решение. – rmaddy