繁体   English   中英

核心数据对多关系获取数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM