我的核心数据模型中定义了一个名为“RemainingGaneProjections”的获取请求。我想执行该获取请求并按实体的某个属性对结果进行排序。我的代码如下所示:
NSFetchRequest *projectionsRequest = [model fetchRequestTemplateForName:@"RemainingGameProjections"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidence" ascending:NO];
[projectionsRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
当我尝试执行此代码时,它崩溃并显示以下消息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't modify a named fetch request in an immutable model.'
我已在调试器中确认当我在NSFetchRequest上执行setSortDescriptors方法时发生此崩溃。我无法弄清楚为什么会这样。
对此处发生的事情的任何解释?在检索需要排序的数据时,我应该使用另一种方法吗?
答案 0 :(得分:37)
我在所有地方的Apple文档中找到了答案。因为我的提取请求没有替换参数,所以我使用了fetchRequestTemplateForName方法而不是fetchRequestFromTemplateWithName。事实证明,核心数据编程指南说明了这一点:
如果模板没有替换变量,则必须:
- 使用fetchRequestFromTemplateWithName:substitutionVariables:并传递 nil作为变量参数;
- 使用fetchRequestTemplateForName:和 复制结果。如果您尝试使用返回的获取请求 fetchRequestTemplateForName:,这会生成一个异常(“不能 修改不可变模型中的命名获取请求“)。
醇>
我修改了我的获取请求初始化来执行此操作:
NSFetchRequest *projectionsRequest = [[model fetchRequestTemplateForName:@"RemainingGameProjections"] copy];
现在一切都按预期工作了。
答案 1 :(得分:0)
摘自Apple文档:
NSSortDescriptor * ageDescriptor = [[[NSSortDescriptor alloc] initWithKey:@“ age” ascending:YES];
NSSortDescriptor * hireDateDescriptor = [[[NSSortDescriptor alloc] initWithKey:@“ hireDate” ascending:YES];
NSArray * sortDescriptors = @ [ageDescriptor,hiredDateDescriptor];
NSArray * sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];