NSPredicate,executeFetchRequest 崩溃

Posted

技术标签:

【中文标题】NSPredicate,executeFetchRequest 崩溃【英文标题】:NSPredicate, executeFetchRequest crash 【发布时间】:2013-12-17 08:20:21 【问题描述】:

我正在做一个核心数据教程,但我一直在崩溃。这是一个 objc_exception_throw。

我创建了一个名为 loadTableData 的方法并在 viewDidLoad 中调用它

-(void)loadTableData
    NSManagedObjectContext *context = [[self appDelegate]managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Label" inManagedObjectContext:context];

    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"label like %@", [context objectWithID: self.labelID]];

    [fetchRequest setPredicate:predicate];


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"name" ascending:YES];

    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    self.artistArray = [context executeFetchRequest:fetchRequest error:&error];

    [self.tableView reloadData];

卡在这里

self.artistArray = [context executeFetchRequest:fetchRequest error:&error];

注释掉谓词 alloc/init 和 setPredicate 方法调用会导致应用程序不会崩溃,但不会执行我想要的操作。

请参阅下面的实体和关系。

在 LabelViewController 中,这里是显示如何设置 [context objectWithID: self.labelID] 的附加代码

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    MLBLArtistViewController *artistViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ArtistViewController"];

    Label *label = [self.labelArray objectAtIndex:indexPath.row];

    artistViewController.labelID = [label objectID];

    [self.navigationController pushViewController:artistViewController animated:YES];

【问题讨论】:

“标签”是“标签”实体的属性吗?它有什么类型?什么样的对象返回[context objectWithID: self.labelID] @MartinR 请参阅上面已编辑的问题。 【参考方案1】:

我会改用CONTAINS

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"label CONTAINS[cd] %@", [context objectWithID: self.labelID]];

您可以使用 LIKE,但我喜欢 CONTAINS 的简单性,请参阅以下问题: NSPredicate that is the equivalent of SQL's LIKE

【讨论】:

很酷的提示,仍然崩溃。 你能发布崩溃日志吗? 看起来您正在将一个对象传递到您的谓词中,而不是寻找一个特定的属性? [context objectWithID: self.labelID] 很确定这行不通。 12/17/13 12:41:31.037 AM Xcode[551]: [MT] IDENavigableItemCoordinator: - number:1 -名称:线程 1)> 有 9 个子项,但 indexOfChildItemForIdentifier: '6574070280564460612' 返回的索引为 9 见上面 Martin R 的评论,需要回答的重要问题【参考方案2】:

首先,您似乎想要获取“艺术家”对象,而不是“标签”对象:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:context];

接下来,LIKECONTAINS 用于测试字符串,你需要一个简单的==

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"label == %@", [context objectWithID:self.labelID]];

备注:label 对象本身传递给推送的视图控制器会更简单, 而不是[label objectID]

【讨论】:

以上是关于NSPredicate,executeFetchRequest 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate

NSPredicate 谓词

子查询中的 NSPredicate

NSPredicate 问题

NSPredicate 字符串

NSPredicate == 查询