错误:实体不是密钥的密钥值编码 - 核心数据

时间:2014-01-19 06:13:10

标签: ios core-data uitableview

关于SO也有类似的问题,但我找不到对我有帮助的确切答案。我有一个核心数据项目,有两个实体,练习和图像。该应用程序允许用户将练习添加到SQL数据库并将其显示在tableView中。练习名称,描述和类型等属性位于练习实体中。图像实体中有两个图像。一切都很好,除了我想在表格的每个单元格中有每个练习的缩略图。我无法弄清楚如何从Image实体访问其中一个图像。以下是tableView实现文件中的相关代码:

#import "TableViewController.h"
#import "AddNewExViewController.h"
#import "Exercises.h"
#import "Images.h"
#import "DetailViewController.h"

@interface TableViewController ()

@end

@implementation TableViewController

@synthesize context, arr;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
     if (self) {
         self.title = @"Exercises";
}
    return self;
}

- (void)viewWillAppear:(BOOL)animated
{    
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercises"      inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setFetchBatchSize:20];
    [request setEntity:entity];
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *newArray = [NSArray arrayWithObject:sort];    
    [request setSortDescriptors:newArray];
    NSError *error;
    NSMutableArray *results = [[context executeFetchRequest:request error:&error] mutableCopy];
    [self setArr:results];
    [self.tableView reloadData];
}

#pragma mark - Table view data source

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

    Exercises *exercises = [arr objectAtIndex:indexPath.row];

    cell.textLabel.text = [exercises name];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@, %@", exercises.type, exercises.part, exercises.difficulty];
    cell.imageView.image = [UIImage imageWithData:[exercises valueForKey:@"image2"]];

    return cell;
}

@end

错误发生在行cell.imageView.image = [UIImage imageWithData:[exercise valueForKey:@“image2”]]。我理解为什么,但我不知道如何解决它。

更新

现在修复此问题,感谢Dan Shelly的建议:使用valueForKeyPath而不是valueForKey。我在整个应用程序中纠正了这个如果图像没有显示在tableView或单元格或应用程序中的任何其他位置,则没有错误。我检查了SQL数据库,他们在那里。用户应该能够在AddExViewController中添加图像:

AddExViewController.m

- (void) add
{
    NSManagedObjectContext *context = [app managedObjectContext];

    Exercises *exercises = [NSEntityDescription insertNewObjectForEntityForName:@"Exercises" inManagedObjectContext:context];

    // removed code not relevant for this issue

    //convert images into NSData
    NSData *img1 = [NSData dataWithData:UIImageJPEGRepresentation(imageView1.image, 0.5)];
    [exercises.self setValue:img1 forKeyPath:@"imgs.image1"];

    NSData *img2= [NSData dataWithData:UIImageJPEGRepresentation(imageView2.image, 0.5)];
    [exercises.self setValue:img2 forKeyPath:@"imgs.image2"];

    [self dismissViewControllerAnimated:YES completion:nil];

}

但是这些图像没有显示在tableView单元格中,也没有显示在用户点击一行时调用的DetalViewController中:

DetailViewController.m

- (void) viewWillAppear:(BOOL)animated
{ 
    //convert images back from NSData back into UIImage
    UIImage *image1 = [UIImage imageWithData:[exercises valueForKeyPath:@"imgs.image1"]];
    [[self imageView1] setImage:image1];

    UIImage *image2 = [UIImage imageWithData:[exercises valueForKeyPath:@"imgs.image2"]];
    [[self imageView2] setImage:image2];

}

同样,当我只使用一个实体时,一切正常。

1 个答案:

答案 0 :(得分:1)

首先,Apple建议将图像放在单独的文件中(不在CoreData商店中)。

其次,由于现在您的图像位于自己的实体中,因此您应该将代码更改为访问图像数据,如下所示:

[UIImage imageWithData:[obj valueForKeyPath:@"image2.imageData"]];

此外,我建议将此行添加到您的获取请求中,以便您的用户界面运行更顺畅:

[request setRelationshipKeyPathsForPrefetching:@[@"image2"]];

总而言之,将VC改为使用NSFetchedResultsController