将排序描述符应用于从模板创建的NSFetchRequest

时间:2011-09-15 04:03:38

标签: objective-c core-data

我的核心数据模型中定义了一个名为“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方法时发生此崩溃。我无法弄清楚为什么会这样。

对此处发生的事情的任何解释?在检索需要排序的数据时,我应该使用另一种方法吗?

2 个答案:

答案 0 :(得分:37)

我在所有地方的Apple文档中找到了答案。因为我的提取请求没有替换参数,所以我使用了fetchRequestTemplateForName方法而不是fetchRequestFromTemplateWithName。事实证明,核心数据编程指南说明了这一点:

  

如果模板没有替换变量,则必须:

     
      
  1. 使用fetchRequestFromTemplateWithName:substitutionVariables:并传递   nil作为变量参数;
  2.   
  3. 使用fetchRequestTemplateForName:和   复制结果。如果您尝试使用返回的获取请求   fetchRequestTemplateForName:,这会生成一个异常(“不能   修改不可变模型中的命名获取请求“)。
  4.   

我修改了我的获取请求初始化来执行此操作:

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];

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html