一对多关系核心数据:在prepareForSegue中获取:

Posted

技术标签:

【中文标题】一对多关系核心数据:在prepareForSegue中获取:【英文标题】:One-to-many relationship Core Data : fetching in prepareForSegue: 【发布时间】:2013-11-03 07:48:52 【问题描述】:

在过去的几个小时里,我一直在扯头发,试图弄清楚为什么这不起作用。我在 Core Data 中有一对多的关系,并且正在尝试将值正确传递给详细信息 segue。

下面是数据模型(属性为二进制数据类型):

如果我在 configureCell: 方法中获取数据,它会给我预期的值:

- (void)configureCell:(UITableViewCell *)cell atIndexPath(NSIndexPath *)indexPath 
 
TBAppDelegate *delegate = (TBAppDelegate *)[[UIApplication sharedApplication] delegate];

managedObjectContext = [delegate managedObjectContext];

self.everything = [fetchedResultsController.fetchedObjects objectAtIndex:indexPath.section];

NSArray *arg = [NSKeyedUnarchiver unarchiveObjectWithData:self.everything.urls.urls];

NSLog (@"%@, [arg valueForKey:@"source"]); // this prints out a list of stored urls containing locations of jpeg images

我的 NSFetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController 
 
TBAppDelegate *delegate = (TBAppDelegate *)[[UIApplication sharedApplication] delegate];

self.managedObjectContext = delegate.managedObjectContext;

NSFetchRequest *fetchRequest = nil;

fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = nil;

entity = [NSEntityDescription entityForName:@"Everything" inManagedObjectContext:managedObjectContext];

[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:INFINITY];

NSSortDescriptor *albumDescriptor = nil;

albumDescriptor = [[NSSortDescriptor alloc] initWithKey:@"album_names" ascending:NO];

NSSortDescriptor *urlDescriptor = nil;

urlDescriptor = [[NSSortDescriptor alloc] initWithKey:@"urls.urls" ascending:NO];

NSArray *sortDescriptors = nil;

sortDescriptors = [[NSArray alloc] initWithObjects:albumDescriptor, urlDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *frc = nil;

frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

[frc setDelegate:self];

[self setFetchedResultsController:frc];

return frc;


这是我的 prepareForSegue: 方法。这部分不起作用。当我尝试设置详细视图控制器的部分计数时,它会因无法识别的选择器错误而崩溃。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

    NSIndexPath *indexPath;

    indexPath = [self.tableView indexPathForSelectedRow];

    TBAppDelegate *delegate = (TBAppDelegate *)[[UIApplication sharedApplication] delegate];

    managedObjectContext = [delegate managedObjectContext];

    self.everything = [fetchedResultsController.fetchedObjects objectAtIndex:indexPath.section];

    NSArray *data = [NSKeyedUnarchiver unarchiveObjectWithData:self.everything.album_names];

    NSArray *urls = [NSKeyedUnarchiver unarchiveObjectWithData:self.everything.urls.urls];

    TBEverythingDetailViewController *details = segue.destinationViewController;

    details.everything = [[data objectAtIndex:indexPath.section]valueForKey:@"name"];

    self.urls.urls = [fetchedResultsController.fetchedObjects objectAtIndex:indexPath.section];

    details.everythingGroup = [urls objectAtIndex:indexPath.section];  

部分细节视图控制器:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 


// This is where the actual crash happens. It complains about [_NSDictionaryM urls:] unrecognized selector sent to instance
NSArray *count = [NSKeyedUnarchiver unarchiveObjectWithData:self.everythingGroup.urls.urls];

return [count count]; 

我觉得我在这里遗漏了一些明显的步骤,说明它为什么不起作用。我可以帮忙吗?

【问题讨论】:

你实际上是从 -fetchedResultsController 返回一个 NSFetchedResultsController 吗? 【参考方案1】:

您确实将详细信息 EverythingGroup 设置为:

NSArray *urls = [NSKeyedUnarchiver unarchiveObjectWithData:self.everything.urls.urls];
details.everythingGroup = [urls objectAtIndex:indexPath.section];

正如我在 URLs.urls 中看到的,是一个归档到 NSData 中的字典数组。所以details.everythingGroup 现在是一本字典,但你正在访问它:

NSArray *count = [NSKeyedUnarchiver unarchiveObjectWithData:self.everythingGroup.urls.urls];

在这里崩溃是正常的。 当您访问它时,details.everythingGroup 应该是 Everything

【讨论】:

【参考方案2】:

您的 self.everythinggrpup 是一个 NSDictionary,因此不会响应选择器“urls”。在某个地方,您将 NSDictionary 而不是 Everything 对象分配给 self.everythinggroup。所以你不需要这样做,或者从字典中取出所有对象,然后向它询问 url。取决于您是如何设置的。

【讨论】:

以上是关于一对多关系核心数据:在prepareForSegue中获取:的主要内容,如果未能解决你的问题,请参考以下文章

核心数据以一对多关系保存在后台

核心数据:NSPredicate 一对多对多关系

核心数据:重启时排序的一对多关系

核心数据一对多关系不存储其数据

核心数据:在一对多关系中匹配多个项目的组合

核心数据一对多关系在获取新对象后失去关系[重复]