我從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];
}
感謝,偉大的答案。現在我明白了。但是,這對我來說似乎有點矯枉過正。你是否知道這個問題的其他解決方法?如果有的話? – Eyeball
@Eyeball你可以隨時在[這個答案]中創建自己的'COLLATE'函數(http://stackoverflow.com/questions/16806570/how-do-i-compare-characters-in-custom-sqlite-collation- in-objective-c) – Alexander