0

我试图从 my 中读取行SQLite DB,然后将数据转换JSONNSMutableArray. 然后我想遍历数组并将数据打印到我的table view.

这就是我从以下位置加载数据的方法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'

任何想法我做错了什么?

4

2 回答 2

0

您对 JSON 的使用很有趣,它只是一种创建字典并将它们嵌套在数组中的简短代码方式。容器比您真正需要的要多,您可以创建字典而无需所有 JSON 争吵。

也就是说,您的实际错误是因为这一行:

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

应该

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

因为你有那些嵌套数组,所以你没有深入到它们的底部......

于 2013-10-27T15:37:42.307 回答
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使用您在数据库获取中正确设置的具有适当属性的自定义对象。

于 2013-10-27T15:38:36.627 回答