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:首先,您似乎想要获取“艺术家”对象,而不是“标签”对象:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:context];
接下来,LIKE
或 CONTAINS
用于测试字符串,你需要一个简单的==
:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"label == %@", [context objectWithID:self.labelID]];
备注: 将label
对象本身传递给推送的视图控制器会更简单,
而不是[label objectID]
。
【讨论】:
以上是关于NSPredicate,executeFetchRequest 崩溃的主要内容,如果未能解决你的问题,请参考以下文章