2014-09-01 3 views
0

Я хочу создать NSMutableDictionnary с NSString.Создать NSMutableDictionary с NSString

-(NSMutableDictionary *)getList{ 
//Declaration d'un objet SQLITE 
sqlite3 *database; 

//Declaration de notre String qui sera retourne 
NSMutableDictionary *aromaArray = [[NSMutableDictionary alloc] init]; 

// Ouverture de la base de donnees 
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 

    //Chaine de caracteres de la requete 
    const char *sqlStatement = "SELECT name_fr FROM aroma_huiles"; 

    //Creation de l'objet statement 
    sqlite3_stmt *compiledStatement; 

    //Compilation de la requete et verification du succes 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

     // Creation d'un dictionnaire des noms de colonnes 
     NSDictionary *dictionary = [self indexByColumnName:compiledStatement]; 
     //char **final = malloc(4096 * sizeof(*final)); 
     NSMutableArray *array = [[NSMutableArray alloc] init]; 

     while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 

      //Assigne la valeur dans la chaine de caracteres 
      char *tab; 
      tab = (char*)sqlite3_column_text(compiledStatement, [[dictionary objectForKey:@"name_fr"] intValue]); 
      NSString *final = [NSString stringWithUTF8String:tab]; 
      if (final != nil) { 
       NSString *firstLetter = [final substringToIndex:1]; 
       [aromaArray setObject:final forKey:firstLetter]; 
      } 
     } 
    } 
    else { 
     //Envois une exception en cas de probleme de requete 
     NSAssert1(0, @"Erreur :. '%s'", sqlite3_errmsg(database)); 
    } 

    // Finalisation de la requete pour liberer la memoire 
    sqlite3_finalize(compiledStatement); 

} 
else { 
    //Envois une exception en cas de probleme d'ouverture 
    NSAssert(0, @"Erreur d'ouverture de la base de donnees"); 
} 
//Fermer la base de donnees 
sqlite3_close(database); 

//Retourne la valeur 
return aromaArray; 

}

Я думаю, что это самый простой способ, только 2 линии, но она все еще отвергают его:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString count]: unrecognized selector sent to instance 0x1093180c0' 
+0

добавить точку останова исключение и Xcode покажет вам где это исключение генерируется ... – trojanfoe

+0

Я знаю, что это проблема цикла, но я могу понять, как я могу построить Dictionnary в простой форме. –

+0

Вы уже исправили проблему цикла. Теперь вы получаете совершенно другую ошибку. Вы найдете решение здесь: http://stackoverflow.com/questions/18888059/cannot-find-executable-for-cfbundle-certuiframework-axbundle –

ответ

1

То, что вы видите, что переменная array доступна за пределами ее границ. Просто нет элемента после индекса 66, так как он содержит только 67 элементов.

При использовании итерации по array вы используете трудно читаемые конструкции контуров. Вместо while в вашем случае вы можете преобразовать вашу петлю использовать for конструкции:

for (int j = 0; j < [array count]; j++) { 
... 
    for (int i = 0; i < [array count]; i++) { 
    ... 
    } 
} 

Doing так что нет никакой необходимости больше для сброса i в 0 и нет никакой необходимости в увеличении i и j вне заголовка петли (удалите i++ и j++ инструкции в нижней части ваших петель).

+0

По-прежнему такая же ошибка с циклом for. –

+0

Пожалуйста, разместите обе вложенные циклы, как вы их реализовали, используя конструкторы 'for' на http://pastebin.com, а затем дайте ссылку здесь как комментарий. –

+0

Я изменил свой первый пост с помощью цикла for –

0

Изменение while (array[j]) к while (j < [array count])

+0

Я сделал это и изменил время, когда , но все равно та же ошибка, и журнал хорош .. –

+0

Возможно, проблема в строке ** NSString * firstLetter = [array [i] substringToIndex: 1]; **? Измените на ** if (i <[количество массивов]) {NSString * firstLetter = [array [i] substringToIndex: 1]} ** – user2828120

+0

Я не думаю, что он отлично работает, когда я хочу напечатать firstLetter и secondLetter в журналы хорошо напечатаны, а если это хорошо .. –

0

Почему вы не непосредственно создавать словаря в то время как вы выборки данных из БД

while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 

      //Assigne la valeur dans la chaine de caracteres 
      char *tab; 
      tab = (char*)sqlite3_column_text(compiledStatement, [[dictionary objectForKey:@"name_fr"] intValue]); 
      NSString *final = [NSString stringWithUTF8String:tab]; 
      if (final != nil && final.length >0) { 
//get substring from string here 
NSString *firstLetter = [final substringToIndex:1]; 
//Add objects in dictionary here 
        [aromaArray setObject:final forKey:firstLetter]; 
      } 
     } 
+0

Я пытаюсь сделать это: http://pastebin.com/DkVQdrXa Но это говорит мне: [__NSCFString count]: непризнанный селектор, отправленный в экземпляр 0x10973e5c0 2014-09-01 10: 51: 37.711 SQLite-TUO [22126 : 60b] *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [__ NSCFString count]: нераспознанный селектор, отправленный экземпляру 0x10973e5c0' –

+0

Пожалуйста, проверьте мой обновленный ответ. –

+0

Да еще такая же ошибка .. Все выглядит нормально: http://pastebin.com/Mx4n7FsR? –

0

Я думаю, что причина аварии эти строки

tab = (char*)sqlite3_column_text(compiledStatement, [[dictionary objectForKey:@"name_fr"] intValue]); 
NSString *final = [NSString stringWithUTF8String:tab]; 

если символьное значение является ноль и преобразуется в строковое значение, которое может возникнуть исключение. Случай возникает, когда в соответствующей строке таблицы нет значения.

поэтому попробуйте

tab = (char*)sqlite3_column_text(compiledStatement, [[dictionary objectForKey:@"name_fr"] intValue]); 
if(tab){ 
    NSString *final = [NSString stringWithUTF8String:tab]; 
    //everything else that comes under is to be here 
} 
+0

Уже проверьте, что (final! = nil), это то же самое. Моя проблема полна отличается от того, что я думал ... –

+0

Пожалуйста, снова прочитайте ответ –

+0

'stringWithUTF8String' может быть преступником –

0

Так что я, наконец, удалось решить эту проблему! Простое решение, немного медленное, но все же оно работает сейчас! Моя проблема была совершенно иной, чем то, что я думал в начале. Я попытался сделать Dictionnary с NSString, и значения были заменены в каждом цикле. Так что у меня было только 20 продуктов, когда у меня было 84 в начале, Dictionnary был построен, но он разбился, потому что я вставил DIctionnary, сделанный с NSArray ! Я не заметил, так что я, наконец, найти решение (я заменит время с): для

tab = (char*)sqlite3_column_text(compiledStatement, [[dictionary objectForKey:@"name_fr"] intValue]); 
      NSString *final = [NSString stringWithUTF8String:tab]; 
      if (final != nil && final.length >0) { 
       [array addObject:final]; 
      } 
     } 
     int i = 0; 
     int j = 0; 
     NSMutableArray *table = [[NSMutableArray alloc] init]; 
     while (i < [array count]) 
     { 
      NSString *firstLetter = [array[i] substringToIndex:1]; 
      table = [[NSMutableArray alloc] init]; 
      while (j < [array count]) 
      { 
       NSString *secondLetter = [array[j] substringToIndex:1]; 
       if ([secondLetter isEqualToString:firstLetter]) { 
        [table addObject:array[j]]; 
       } 
       j++; 
      } 
      j = 0; 
      [aromaArray setObject:table forKey:firstLetter]; 
      i++; 
     } 

Спасибо всем за вашу помощь :)

Смежные вопросы