[英]Core Data to-many relationship get data
在我的代码中,我想创建带有List部分的tableView。 我使用这样的方案:
我使用以这种方式定义的NSFetchResultController:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Item" inManagedObjectContext:coreDataController.masterManagedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"addedAt" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"itemIsChecked = 1"];
[fetchRequest setPredicate:predicate];
[fetchRequest setResultType:NSDictionaryResultType];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:coreDataController.masterManagedObjectContext sectionNameKeyPath:@"toList.listName"
cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
现在在cellForRowAtIndexPath中:我想从我的fetchResultController获取数据,所以我这样做:
Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
然后,如果我想访问项目的字段之一(例如itemText),它将崩溃:
NSLog(@"item itemtext = %@", item.itemText);
错误:
-[NSKnownKeysDictionary1 itemText]: unrecognized selector sent to instance 0x1215fd90
我在代码中做错了什么?
你已经设定
[fetchRequest setResultType:NSDictionaryResultType];
因此,提取的结果控制器将返回NSDictionary
对象,而不是Item
对象。 所以你的元素
Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
是NSDictionary
,而不是Item
。 由于字典没有itemText
方法,因此item.itemText
崩溃。 您可以使用以下方法从字典中检索值:
NSDictionary *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"item itemtext = %@", [item objectForKey:@"itemText"]);
但是,如果没有特定的原因将结果类型设置为NSDictionaryResultType
,则应该删除该行。 提取结果控制器的更改跟踪(即自动表视图更新)不适用于resultType == NSDictionaryResultType
。
还要注意,如果设置了sectionNameKeyPath
,则必须添加具有相同键路径“ toList.listName”的排序描述符,并将其用作获取请求的第一个排序描述符。
unrecognized selector sent to instance
通常是由于不良的内存管理而发生的。 检查您是否要指向先前发布的对象。 还要检查xib中的IBOutlet连接以获取标签itemText
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.