2013-08-16 60 views
0

我从sqlite数据库检索配料并将它们插入到我的表视图中。每次用户编辑位于屏幕上的搜索栏(UISearchBar)时都会执行此操作。iOS:使用sqlite3查询瑞典语字母时遇到问题

QueryMethod

-(NSArray*)sqliteInfo:(NSString*)predicateString{ 
    NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease]; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(_database, [predicateString UTF8String], -1, &statement, nil) 
     == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      char *nameChars = (char *) sqlite3_column_text(statement, 0); 
      NSString *name = [[NSString alloc] initWithUTF8String:nameChars]; 

      sqlite *info = [[sqlite alloc] 
            initWithName:name carbs:nil fat:nil kcal:nil]; 
      [retval addObject:info]; 
      [name release]; 
     } 
     sqlite3_finalize(statement); 
    } 
    return retval; 

} 

这是我如何格式化我的查询和更新的实现代码如下:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 

    if (searchText.length < 2) { 
     return; 
    } else { 

    [self.nutritionList removeAllObjects]; 

    NSString *formatString = [[@"'%"stringByAppendingString:searchText]stringByAppendingString:@"%' ORDER BY namn COLLATE NOCASE"]; 
    NSArray *array = [[NutritionsDB database] sqliteInfo:[NSString stringWithFormat:@"Select namn from livsmedel where namn like %@", formatString ]]; 
    for (sqlite *info in array) { 
     [self.nutritionList addObject:info.name]; 
    } 
    [self.tableView reloadData]; 

    } 
} 

正如你可以formatString看到我想订购的结果,忽略字符串的情况

ORDER BY namn COLLATE NOCASE 

这工作正常,但与瑞典字母Å,Ä,Ö,案件忽略失败。

如果我搜索'Ål',我的搜索结果与我搜索'ål'的结果不同。 换句话说,配料“人”不显示,当我搜索“人”

我的问题: 我怎么能有SQLite的忽略的情况下,与国外(瑞典)字母包括在内?

希望以上是有道理的,

感谢。

编辑

结束了以下方法:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 


    if (searchText.length < 2) { 
     return; 
    } else { 

     NSString *firstChar = [searchText substringWithRange:NSMakeRange(0, 1)]; 

     if([firstChar isEqualToString:@"å"] || 
      [firstChar isEqualToString:@"Å"] || 
      [firstChar isEqualToString:@"ä"] || 
      [firstChar isEqualToString:@"Ä"] || 
      [firstChar isEqualToString:@"ö"] || 
      [firstChar isEqualToString:@"Ö"]){ 

      NSString *lowerString = [firstChar lowercaseString]; 
      NSString *upperString = [firstChar uppercaseString]; 

      NSString *newSearchText = [searchText stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:lowerString]; 
      NSString *newSearchText_upper = [searchText stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:upperString]; 

      NSString *formatString = [[[[[@"'%"stringByAppendingString:newSearchText]stringByAppendingString:@"%'"] 
             stringByAppendingString:@" OR namn like'%"]stringByAppendingString:newSearchText_upper]stringByAppendingString:@"%' ORDER BY namn COLLATE NOCASE"]; 

      NSLog(formatString); 
      [self.nutritionList removeAllObjects]; 
      NSArray *array = [[NutritionsDB database] sqliteInfo:[NSString stringWithFormat:@"Select namn from livsmedel where namn like %@", formatString ]]; 
      for (sqlite *info in array) { 
       [self.nutritionList addObject:info.name]; 
      } 
      [self.tableView reloadData]; 
      return; 
      } 

     } 

     [self.nutritionList removeAllObjects]; 

     NSString *formatString = [[@"'%"stringByAppendingString:searchText]stringByAppendingString:@"%' ORDER BY namn COLLATE NOCASE"]; 
     NSArray *array = [[NutritionsDB database] sqliteInfo:[NSString stringWithFormat:@"Select namn from livsmedel where namn like %@", formatString ]]; 
     for (sqlite *info in array) { 
      [self.nutritionList addObject:info.name]; 
     } 
     [self.tableView reloadData]; 

} 

回答

1

reference manual;

NOCASE - 与二进制相同,只是在执行比较之前,将ASCII的26个大写字符折叠为小写字母。请注意,只有ASCII字符是大小写的。 由于所需表的大小,SQLite不会尝试执行完整的UTF大小写折叠。

您最好的选择可能是compile your own SQLiteICU extensions

查询方法中
+0

感谢,伟大的答案。现在我明白了。但是,这对我来说似乎有点矫枉过正。你是否知道这个问题的其他解决方法?如果有的话? – Eyeball

+1

@Eyeball你可以随时在[这个答案]中创建自己的'COLLATE'函数(http://stackoverflow.com/questions/16806570/how-do-i-compare-characters-in-custom-sqlite-collat​​ion- in-objective-c) – Alexander

0

,而不是[predicateString UTF8String]尝试使用

[predicateString cStringUsingEncoding:NSISOLatin1StringEncoding] 

[predicateString cStringUsingEncoding:NSUTF8StringEncoding] 
+0

这两个都不害怕 – Eyeball