我通過創建自己的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
函數負責正確引用和轉義值。
那是相當難看,而不是非常可擴展的解決了這個問題。你應該考慮我的解決方案。 – rmaddy