如何使用核心数据保存和显示图像

时间:2013-12-06 00:33:26

标签: ios uitableview core-data

我正在尝试将使用应用程序拍摄的图像保存到核心数据,然后将其显示在UITableView中。我写了一些我认为应该有用的代码,但事实并非如此。提前谢谢!

以下是保存图片的代码:

- (void)saveImage {

//    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(self.thumbImage)];
//    
//    [managedObjectContext setValue:imageData forKey:@"imageData"];
//    
//    NSLog(@"Saved to CoreData");

    NSManagedObjectContext *context = [self managedObjectContext];

    TimeTravelFeed *timeTravelFeed = [NSEntityDescription insertNewObjectForEntityForName:@"TimeTravelFeed" inManagedObjectContext:context];

    NSData *imageData = UIImageJPEGRepresentation(thumbImage, 0.8f);

    [timeTravelFeed setValue:imageData forKey:@"imageData"];

}

我正在展示它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    PhotoCell *cell = (PhotoCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        cell = [[PhotoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    // Configure the cell...
    TimeTravelFeed *feed = [timeTravelFeeds objectAtIndex:indexPath.row];
    NSData *data = feed.imageData;

    self.feedImage = [UIImage imageWithData:data];
    cell.thumbImage = self.feedImage;

    return cell;
}

2 个答案:

答案 0 :(得分:2)

您的代码存在许多问题。

首先,正如已经指出的那样,你没有打电话给[context save:nil]

其次,您的单元格似乎没有图像视图,只有图像。这不是很透明。据推测,该单元负责将feedImage属性分配给某个图像视图。最好为PhotoCell提供图像视图属性并用

填充它
cell.imageView.image = imageRetrieved;

第三,在单元格中,首先将转换后的图像分配给某个类变量(self.feedImage)。这不合逻辑,完全没必要。而是使用具有局部范围的变量或直接将图像分配给图像视图。

最后,你不应该在Core Data中存储大的blob(照片)。建议您仅存储小图像,例如缩略图。对于较大的文件,您应该将路径存储在Core Data实体中,将图像文件存储在documents目录中。这也可以通过在模型编辑器中选中“允许外部存储”来自动完成。

其他建议:在NSManagedObject子类中进行转换,这样您就不必关心控制器的这种技术性。

答案 1 :(得分:0)

看起来您没有成功保存图片。尝试将此添加到saveImage

if (![context save:&error]) {
    NSLog(@"Some error", [error localizedDescription]);
}