核心数据NSFetchRequest按类别方法排序返回值

时间:2014-02-15 03:57:39

标签: core-data nsfetchrequest nssortdescriptor nsfetchedresultscontroller

如何按我正在获取的实体类别中的方法返回的值对获取的结果进行排序?

在我的类别中,我从实体的多对多关系中总结了几个值,然后除以关系中的对象数,有效地创建了我在类别方法中作为浮点值返回的平均值。

这是我的代码:

在Category.h中

- (float)smallPenaltyAvg;

在Category.m

- (float)smallPenaltyAvg{
    float smallPenaltyAvg = 0;
    for (Match *mtch in self.matches) {
        smallPenaltyAvg += [mtch.penaltySmall floatValue];
    }

    if ([self.matches count] > 0) {
        smallPenaltyAvg = (float)smallPenaltyAvg/(float)[self.matches count];
    }

    return smallPenaltyAvg;
}

当我在我创建的Core Data Table View Controller类中调用它时......

NSFetchRequest *poolRequest = [[NSFetchRequest alloc] initWithEntityName:@"Team"];
poolRequest.predicate = [NSPredicate predicateWithFormat:@"regionalIn.name = %@", _regionalToDisplay];
poolRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"smallPenaltyAvg" ascending:YES]];

我在Category.h文件本身之外的每个文件上都导入了Category.h文件。

它给了我错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath smallPenaltyAvg not found in entity <NSSQLEntity Team id=5>

我不被允许这样做吗?

如果我是,我做错了什么?

3 个答案:

答案 0 :(得分:1)

我认为这与持久性商店的存在无关。

诀窍是在托管对象模型中创建适当的属性,并将其标记为Transient。然后覆盖此属性的getter以进行计算。

现在你的获取请求应该按预期工作(尽管有一些关于获取结果控制器的警告)。

对于SQLite问题,当您使用

添加SQLite存储时
 - (NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType 
    configuration:(NSString *)configuration 
    URL:(NSURL *)storeURL 
    options:(NSDictionary *)options 
    error:(NSError **)error

NSSQLiteStoreType作为storeType传递。其他选项是二进制和内存,因此在这个意义上这确实是“默认”。

答案 1 :(得分:0)

使用支持SQLite存储时,这是不可能的。

我的建议是你坚持使用普通属性,并通过覆盖Match setCategory:属性来自行维护,并为每个匹配项进行计算。

答案 2 :(得分:0)

我为解决我的问题所做的是为Team对象中的所有Match对象的属性创建一个新的属性,然后在TeamCategory文件中创建一个填充了这些平均值的方法。每次将Match对象插入Team对象时都会调用method。这需要一段时间才能完成,但它现在有效。如果有更好的解决方案,我仍然愿意接受建议。