cocoa touch - iOS: trouble when querying swedish letters with sqlite3 -
i retrieving ingredients sqlite database , inserting them table view. done every time user edits search bar (uisearchbar) located on screen.
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; } this how format queries , update tableview:
-(void)searchbar:(uisearchbar *)searchbar textdidchange:(nsstring *)searchtext{ if (searchtext.length < 2) { return; } else { [self.nutritionlist removeallobjects]; nsstring *formatstring = [[@"'%"stringbyappendingstring:searchtext]stringbyappendingstring:@"%' order namn collate nocase"]; nsarray *array = [[nutritionsdb database] sqliteinfo:[nsstring stringwithformat:@"select namn livsmedel namn %@", formatstring ]]; (sqlite *info in array) { [self.nutritionlist addobject:info.name]; } [self.tableview reloaddata]; } } as can see in formatstring trying order result , ignore case of string
order namn collate nocase this works fine, swedish letters Å, Ä, Ö, case ignoring fails.
if search 'Ål' not getting same result when search får 'ål'. in other words, ingredient 'Ål' not show when search 'ål'
my question: how can have sqlite ignore case, foreign(swedish) letters included?
hopes above makes sense,
thanks.
edit
ended following approach:
-(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 namn collate nocase"]; nslog(formatstring); [self.nutritionlist removeallobjects]; nsarray *array = [[nutritionsdb database] sqliteinfo:[nsstring stringwithformat:@"select namn livsmedel namn %@", formatstring ]]; (sqlite *info in array) { [self.nutritionlist addobject:info.name]; } [self.tableview reloaddata]; return; } } [self.nutritionlist removeallobjects]; nsstring *formatstring = [[@"'%"stringbyappendingstring:searchtext]stringbyappendingstring:@"%' order namn collate nocase"]; nsarray *array = [[nutritionsdb database] sqliteinfo:[nsstring stringwithformat:@"select namn livsmedel namn %@", formatstring ]]; (sqlite *info in array) { [self.nutritionlist addobject:info.name]; } [self.tableview reloaddata]; }
from reference manual;
nocase - same binary, except 26 upper case characters of ascii folded lower case equivalents before comparison performed. note ascii characters case folded. sqlite not attempt full utf case folding due size of tables required.
your best bet compile own sqlite icu extensions.
Comments
Post a Comment