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的主要内容,如果未能解决你的问题,请参考以下文章