错误:该实体不是密钥编码兼容密钥 - 核心数据
也有类似的问题,所以我找不到确切的答案,这将帮助我。我有一个包含两个实体的练习和图像的核心数据项目。该应用程序允许用户将练习添加到SQL数据库并将其显示在tableView中。练习名称,描述和类型等属性位于练习实体中。两个图像在图像实体中。除了我想要在桌子的每个单元格中放置每个练习的缩略图以外,一切都很好。我无法弄清楚如何访问Image实体中的一个图像。下面是从的tableView实现文件相关的代码:发生就行cell.imageView.image =错误:该实体不是密钥编码兼容密钥 - 核心数据
#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
误差[UIImage的imageWithData:[练习valueForKey:@ “图像2”]]。我明白为什么,但我不知道如何解决它。
更新
现在这个问题是固定的,这要归功于丹雪莉的建议:使用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];
}
再说一次,当我只使用一个实体时,一切正常。
首先,Apple建议将图像放在单独的文件中(而不是在CoreData存储区中)。
第二,因为现在你的图像是在自己的实体,您应该更改您的代码的图像数据访问喜欢的东西:
[UIImage imageWithData:[obj valueForKeyPath:@"image2.imageData"]];
此外,我会建议此行添加到您的取请求,以便您的UI将运行顺畅:
[request setRelationshipKeyPathsForPrefetching:@[@"image2"]];
,总之,改变你的VC使用NSFetchedResultsController