iOS:使用sqlite3查询瑞典字母时出现问题

iOS:使用sqlite3查询瑞典字母时出现问题,ios,cocoa-touch,sqlite,Ios,Cocoa Touch,Sqlite,我正在从sqlite数据库中检索成分,并将它们插入到我的表视图中。每次用户编辑屏幕上的搜索栏(UISearchBar)时都会执行此操作 查询方法: -(NSArray*)sqliteInfo:(NSString*)predicateString{ NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease]; sqlite3_stmt *statement; if (sqlite3_prepare

我正在从sqlite数据库中检索成分,并将它们插入到我的表视图中。每次用户编辑屏幕上的搜索栏(
UISearchBar
)时都会执行此操作

查询方法

-(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;

}
这就是我格式化查询和更新tableview的方式:

-(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];

    }
}
这很好,但对于瑞典字母Å、Ä、Ö,案例忽略失败

如果我搜索“ål”,我不会得到与搜索får“ål”时相同的结果。 换句话说,当我搜索“å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];

}
-(无效)搜索栏:(UISearchBar*)搜索栏文本更改:(NSString*)搜索文本{
如果(searchText.length<2){
返回;
}否则{
NSString*firstChar=[searchText substringWithRange:NSMakeRange(0,1)];
if([firstChar IsequalString:@“å”]||
[firstChar isEqualToString:@“Å”]||
[firstChar isEqualToString:@“ä”]||
[firstChar IsequalString:@“Ä”]||
[firstChar IsequalString:@“ö”]||
[firstChar IsequalString:@“Ö”]){
NSString*lowerString=[firstChar小写字符串];
NSString*upperString=[firstChar uppercaseString];
NSString*newSearchText=[searchText StringByReplacingCharactersRange:NSMakerRange(0,1)和字符串:lowerString];
NSString*newSearchText_upper=[searchText StringByReplacingCharactersRange:NSMakerRange(0,1)和字符串:upperString];
NSString*formatString=[[@“%”stringByAppendingString:newSearchText]stringByAppendingString:@“%”
stringByAppendingString:@“或类似于namn的“%”]stringByAppendingString:newSearchText_upper]stringByAppendingString:@“%”按namn排序的“%”无条件比较“];
NSLog(格式化字符串);
[自我营养学家移除所有对象];
NSArray*数组=[[NutritionDB数据库]sqliteInfo:[NSString stringWithFormat:@“从LivsModel中选择namn,其中namn类似%@”,formatString]];
for(数组中的sqlite*信息){
[self.nutritionList addObject:info.name];
}
[self.tableView重载数据];
返回;
}
}
[自我营养学家移除所有对象];
NSString*formatString=[[[@“%”stringByAppendingString:searchText]stringByAppendingString:@“%”按namn COLLATE NOCASE排序“];
NSArray*数组=[[NutritionDB数据库]sqliteInfo:[NSString stringWithFormat:@“从LivsModel中选择namn,其中namn类似%@”,formatString]];
for(数组中的sqlite*信息){
[self.nutritionList addObject:info.name];
}
[self.tableView重载数据];
}
来自

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

您最好的选择可能是使用。

来自

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


您的最佳选择可能是在查询方法中使用。

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

[predicateString cStringUsingEncoding:NSISOLatin1StringEncoding]


在查询方法中,尝试使用

[predicateString cStringUsingEncoding:NSISOLatin1StringEncoding]


谢谢,回答得很好。现在我知道了。然而,这对我来说似乎有点过分了。你知道这件事的其他解决方法吗?如果有?@Eyeball,您可以随时创建自己的
COLLATE
功能,如感谢,回答得很好。现在我知道了。然而,这对我来说似乎有点过分了。你知道这件事的其他解决方法吗?如果有?@Eyeball,您可以随时创建自己的
COLLATE
函数,如中所示
[predicateString cStringUsingEncoding:NSUTF8StringEncoding]