2013-10-27 3 views
0

Im пытается прочитать строки из моего SQLite DB, а затем преобразует данные в JSON и помещает их в NSMutableArray. Затем я хочу перебрать массив и распечатать данные в моем table view.Как добавить данные JSON в NSMutableArray?

Это то, что я сделать, чтобы загрузить данные из SQLite:

entries = [[NSMutableArray alloc] init]; 
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM chatHistory GROUP BY channelID ORDER BY time DESC"]; 
sqlite3_stmt *statement; 

if(sqlite3_prepare_v2([box db], [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while(sqlite3_step(statement) == SQLITE_ROW) { 
     char *field1 = (char *) sqlite3_column_text(statement, 0); 
     NSString *channelID = [[NSString alloc] initWithUTF8String:field1]; 

     char *field2 = (char *) sqlite3_column_text(statement, 0); 
     NSString *sender = [[NSString alloc] initWithUTF8String:field2]; 

     char *field3 = (char *) sqlite3_column_text(statement, 0); 
     NSString *message = [[NSString alloc] initWithUTF8String:field3]; 

     char *field4 = (char *) sqlite3_column_text(statement, 0); 
     NSString *recipient = [[NSString alloc] initWithUTF8String:field4]; 

     char *field5 = (char *) sqlite3_column_text(statement, 0); 
     NSString *time = [[NSString alloc] initWithUTF8String:field5]; 

     NSString *messageArray = [[NSString alloc] initWithFormat:@"[{ \"channelID\":\"%@\", \"sender\":\"%@\", \"message\":\"%@\", \"recipient\":\"%@\", \"time\":\"%@\"}]", channelID, sender, message, recipient, time]; 

     // Convert to JSON object: 
     NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:[messageArray dataUsingEncoding:NSUTF8StringEncoding] 
                   options:0 error:NULL]; 

     [entries addObject:jsonObject]; 

Теперь вот как я пытаюсь добавить его в мой table view:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"ConvCell"; 
    ConvCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) { 
     cell = [[ConvCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    NSArray *tableData = [self.entries valueForKey:@"message"]; 
    NSLog(@"Message=%@", tableData); 

    cell.visitorName.text = (NSString *) [self.entries objectAtIndex:indexPath.row]; // This trows an error 
    cell.visitorAvatar.image = [UIImage imageNamed:@"hello.png"]; 
    cell.messageTime.text = @"19.10"; 


    return cell; 
} 

И.М. Ошибка при получении является:

exception 'NSInvalidArgumentException', reason: '-[__NSCFArray length]: unrecognized selector sent to instance 0xa0cfc40' 

Любые идеи, что я делаю неправильно?

+0

Почему вы хотите использовать JSON точно? – Wain

+0

Я хочу использовать его для отделения моих столбцов от БД (у меня есть несколько таблиц, которые я хочу заполнить различными переменными). Поэтому я думал, что id использует json, а затем разбирает json, поэтому я могу напечатать правильный var в правой таблице – Alosyius

+0

Длинный снимок, но как выглядит ваш номерOfRowsInSection? –

ответ

0

Ваше использование JSON интересно, это всего лишь короткий способ создания словарей и вложения их в массивы. Есть больше контейнеров, чем вам действительно нужно, и вы могли бы просто создать словари без всех споров JSON.

Тем не менее, фактическая ошибка, потому что строки:

cell.visitorName.text = (NSString *) [self.entries objectAtIndex:indexPath.row]; 

должен быть

cell.visitorName.text = (NSString *) [tableData objectAtIndex:indexPath.row]; 

, потому что у вас есть эти вложенные массивы вы не копать прямо на дно них. ..

0

Ваша установка не идеальна. Это сказано ...

Вы передаете массив сообщений в строку.

[self.entries objectAtIndex:indexPath.row] 

должен возвращать массив, а не строку. То, что вы хотите что-то вроде этого:

NSArray* jsonArray = [self.entries objectAtIndex:indexPath.row]; 
NSDictionary *dictionary = [jsonArray lastObject]; 
cell.visitorName.text = dictionary[@"sender"]; 

Вы можете увидеть, что упаковка вашего одного словаря в массив на самом деле не имеет никакого смысла. Вместо этого вы можете оставить [...] в своем шаблоне JSON. Тогда вы бы

NSDictionary *dictionary = [self.entries objectAtIndex:indexPath.row]; 

Кстати, правильный способ сделать это, чтобы иметь пользовательский объект Message с соответствующими свойствами, которые вы установили прямо в базе данных выборки.

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