我目前正在尝试设置一个NSFetchedResultsController,它将根据多对多关系中的实体数量来命令我的表视图。我不确定这在计算时是否有所不同,但这也是一种反比关系。
我认为这样的事情会好起来的:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Parent"
inManagedObjectContext:managedObjectContext];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]
initWithKey:@"children.@count" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,
nil];
[fetchRequest setSortDescriptors:sortDescriptors];
我不断得到'含有KVC聚集体的Keypath,而不应该有一个;未能处理孩子。@ count'。
关于可能出现什么问题的任何想法?
答案 0 :(得分:3)
据我所知,您无法在查询中应用@count,但您可以轻松地将其应用于获取的数组。
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"children.@count" ascending:NO];
NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
NSArray *sortedArray = [results sortedArrayUsingDescriptors:descriptors];
答案 1 :(得分:1)
我将KVO访问器-countOf<Key>
作为属性添加到我的托管对象模型中作为整数类型。我没有在NSManagedObject
子类中为此属性实现任何内容,因为所有的魔法似乎都在幕后发生。
因此,在此特定情况下,将属性countOfChildren
添加到Parent
实体。这应该删除异常。
编辑:此修补程序似乎仅适用于iOS 6.1,而不适用于iOS 6.0。
答案 2 :(得分:1)
从iOS 13(和朋友)开始,您可以使用派生表达式childCount
创建一个名为children.@count
的{{3}},然后设置fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"childCount" ascending:NO]]
答案 3 :(得分:0)
我最终在我的实体中添加了一个count属性,只是在添加新关系时我就增加了它。使fetchedResultsController更容易使用。
如果您找到使用KVC的方法,请感兴趣。我从来不需要修复这个黑客。
这样的事情可能有用:
entity *match;
match = (entity *)[objects objectAtIndex:0];
NSSet *t = [match valueForKey:@"entity"];
if(![t containsObject:newEntity]){
int newCount = [match.count intValue] +1;
[match addEntityObject:newEntity];
[match setCount:[NSNumber numberWithInt:newCount]];