2013-12-12 64 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]; 

例如,searchWord可以是@「أكل」並且可以與diacritics @「أكل」。

我該如何解決這個問題?

回答

1

我通過創建自己的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函數負責正確引用和轉義值。

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