NSFetchedResultsController 与许多 NSSortDescriptor

Posted

技术标签:

【中文标题】NSFetchedResultsController 与许多 NSSortDescriptor【英文标题】:NSFetchedResultsController with many NSSortDescriptor 【发布时间】:2013-12-12 18:18:48 【问题描述】:

在我的应用程序中,我只使用一个 NSSortDescriptor 对实体进行排序,但现在我需要过滤 4 个不同属性的数据。这是当前排序的代码,结果是来自按属性“displayOrder”排序的实体的所有记录,但我需要通过其他四个属性(年、月、日、组)过滤记录,它们都是整数32除了是字符串的组:

- (NSFetchedResultsController *)fetchedResultsController

  if (fetchedResultsController) return fetchedResultsController;

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = 
               [NSEntityDescription entityForName:@"FavoriteThing" 
                           inManagedObjectContext:managedObjectContext];

  [fetchRequest setEntity:entity];

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

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

  NSFetchedResultsController *aFetchedResultsController = 
              [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                  managedObjectContext:managedObjectContext
                                                    sectionNameKeyPath:nil cacheName:@"ThingsCache"];
  aFetchedResultsController.delegate = self;
  [self setFetchedResultsController:aFetchedResultsController];

  [aFetchedResultsController release];
  [fetchRequest release];
  [sortDescriptor release];
  [sortDescriptors release];

  return fetchedResultsController;
    

我已尝试添加谓词:

NSNumber *yearSearched = 1965;
NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched];

[fetchRequest setPredicate:yearPredicate];

但运行应用程序后,NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched]; 行出现错误 EXC_BAD_ACCESS

属性“todoYear”来自 Integer32 类型

【问题讨论】:

过滤器是什么意思,你尝试了什么? 感谢@Wain的回复,我的意思是过滤符合某些条件的记录(年=x,月=y,日=z,组=@"Azul")... 所以你应该添加一个谓词,而不是另一个排序描述符。 好的,我刚刚下载了 Apple NSPredicate 类参考 PDF 文件,我会尝试找到一种方法来实现我的需求。还是谢谢你。 您好,我已经包含以下几行来检查它: NSNumber *yearSearched = 1965; NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched]; [fetchRequest setPredicate:yearPredicate];但是在运行应用程序后,在 NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched]; 行出现错误 EXC_BAD_ACCESS [fetchRequest setPredicate:yearPredicate];属性“todoYear”来自 Integer32 类型。谢谢@Wain 【参考方案1】:

您的NSNumber 创建错误(您只是将指针设置为整数)。应该是:

NSNumber *yearSearched = @1965;
NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched];

[fetchRequest setPredicate:yearPredicate];

【讨论】:

再次感谢@Wain,用您的最后一个答案更新代码不会引发异常,但应用程序会继续显示所有行,而不是预期的行,只有一条记录的值为 1965属性'todoYear'... 你在 FRC 上打电话给performFetch: 吗? 你通常会在返回新的 FRC 之前调用它(当你创建它时)。 我已经用我的完整源代码更新了你的答案,所以你可以看看那里有什么问题。 只删除缓存名称。

以上是关于NSFetchedResultsController 与许多 NSSortDescriptor的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?