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

Popular posts from this blog

assembly - 8086 TASM: Illegal Indexing Mode -

Java, LWJGL, OpenGL 1.1, decoding BufferedImage to Bytebuffer and binding to OpenGL across classes -

javascript - addthis share facebook and google+ url -