Ios 具有多个NSSortDescriptor的NSFetchedResultsController
在我的应用程序中,我只使用一个NSSortDescriptor对一个实体进行排序,但现在我需要过滤4个不同属性的数据。这是当前排序的代码,结果是实体中的所有记录按属性“displayOrder”排序,但我需要按其他四个属性(年、月、日、组)筛选记录,所有这些属性都是整数32,但组是字符串:Ios 具有多个NSSortDescriptor的NSFetchedResultsController,ios,nsfetchedresultscontroller,nssortdescriptor,Ios,Nsfetchedresultscontroller,Nssortdescriptor,在我的应用程序中,我只使用一个NSSortDescriptor对一个实体进行排序,但现在我需要过滤4个不同属性的数据。这是当前排序的代码,结果是实体中的所有记录按属性“displayOrder”排序,但我需要按其他四个属性(年、月、日、组)筛选记录,所有这些属性都是整数32,但组是字符串: - (NSFetchedResultsController *)fetchedResultsController { if (fetchedResultsController) return fetche
- (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];
但运行应用程序后,在以下行出现错误:EXC_BAD_ACCESSNSPredicate*yearPredicate=[NSPredicate predicateWithFormat:@“todoYear=%@”,yearSearched]代码>
如果属性“todoYear”来自Integer32类型,则您的NSNumber
创建错误(您只是将指针设置为整数)。应该是:
NSNumber *yearSearched = @1965;
NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear = %@", yearSearched];
[fetchRequest setPredicate:yearPredicate];
你说的过滤是什么意思?谢谢你回复@Wain,我的意思是过滤符合某些条件的记录(year=x,month=y,day=z,group=@“Azul”)…所以你应该添加一个谓词,而不是另一个排序描述符。好的,我刚刚下载了Apple NSPredicate类参考PDF文件,我将设法找到一种方法来实现我的需求。不管怎样,谢谢。大家好,我已经包括了以下几行来检查它:NSNumber*yearSearched=1965;NSPredicate*yearPredicate=[NSPredicate predicateWithFormat:@“todoYear=%@”,yearSearched];[FetchRequestSetPredicate:yearPredicate];但运行应用程序后,在NSPredicate*yearPredicate=[NSPredicate predicateWithFormat:@“todoYear=%@”,yearSearched]行处出现错误EXC_BAD_ACCESS;[FetchRequestSetPredicate:yearPredicate];属性“todoYear”来自Integer32类型。再次感谢@WainThank@Wain,使用您最后的答案更新代码不会引发异常,但应用程序会继续显示所有行,而不是预期的行,在属性“todoYear”中只有一条记录的值为1965…您是否在FRC上调用过performFetch:
?您通常会在返回新FRC之前调用它(创建它时)。我已使用完整的源代码更新了您的答案,因此您可以检查那里有什么问题。只需删除缓存名称。