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

Core data 核心数据NSFetchRequest按类别排序方法返回值,core-data,nsfetchrequest,nssortdescriptor,nsfetchedresultscontroller,Core Data,Nsfetchrequest,Nssortdescriptor,Nsfetchedresultscontroller,如何根据正在获取的实体类别中的方法返回的值对获取的结果进行排序 在我的类别中,我将实体的多对多关系中的几个值相加,然后除以关系中对象的数量,有效地创建了一个平均值,我在类别方法中将其作为浮点值返回 这是我的密码: 在类别中 -(float)smallPenaltyAvg; 在类别中 —(浮动)小惩罚{ float smallPenaltyAvg=0; for(匹配*自我匹配中的mtch){ smallPenaltyAvg+=[mtch.PenaltySall floatValue]; } 如果

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

在我的类别中,我将实体的多对多关系中的几个值相加,然后除以关系中对象的数量,有效地创建了一个平均值,我在类别方法中将其作为浮点值返回

这是我的密码:

在类别中

-(float)smallPenaltyAvg;
在类别中

—(浮动)小惩罚{
float smallPenaltyAvg=0;
for(匹配*自我匹配中的mtch){
smallPenaltyAvg+=[mtch.PenaltySall floatValue];
}
如果([self.matches count]>0){
smallPenaltyAvg=(float)smallPenaltyAvg/(float)[self.matches count];
}
退还小额罚款;
}
当我在我创建的核心数据表视图控制器类中调用它时

NSFetchRequest*poolRequest=[[NSFetchRequest alloc]initWithEntityName:@“团队”];
poolRequest.predicate=[NSPredicate predicateWithFormat:@“regionalIn.name=%@”,_regionalToDisplay];
poolRequest.sortDescriptors=@[[NSSortDescriptor SortDescriptor WithKey:@“smallPenaltyAvg”升序:是];
我在前面提到的
Category.h
文件之外的每个文件上都导入了
Category.h
文件

这给了我一个错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“在实体中找不到keypath smallPenaltyAvg”
我不能这样做吗


如果是,我做错了什么?

这在使用备份SQLite存储时是不可能的。


我的建议是您持久化average属性,并通过覆盖
Match
setCategory:
属性并对添加的每个匹配进行计算来维护它。

我认为这与持久化存储的类型无关

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

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

至于SQLite问题,当您使用

-(NSPersistentStore*)添加PersistentStoreWithType:(NSString*)storeType
配置:(NSString*)配置
URL:(NSURL*)存储URL
选项:(NSDictionary*)选项
错误:(n错误**)错误

只需将
NSSQLiteStoreType
作为
storeType
传递即可。其他选项是二进制和内存中的,因此从这个意义上说,这确实是“默认值”

我解决问题的方法是,根据团队对象的所有匹配对象属性,为团队对象中所需的每个平均值或总和创建一个新属性,然后在TeamCategory文件中创建一个方法,填充这些平均值,并在每次将匹配对象插入团队对象时调用该方法。这花了一段时间,但现在可以用了。如果有更好的解决方案,我仍然愿意听取建议。

那么默认的核心数据存储是SQLite?我不这么认为。您必须指定在将其添加到协调器时创建的存储类型。我猜备份存储是SQLite(猜测FSA…基于
NSManagedDocument
),您可以检查您的文件系统并亲自查看…我收到的错误表明我使用的是NSSQL,而不是SQLite。我也不认为我在代码中加入了任何根据错误指定SQLite的内容,很明显,您确实使用了一个支持SQLite存储(至少是您使用的框架)。您介意为一个返回浮点值(或一个带有浮点值的NSNumber)的瞬态属性执行一个示例平均计算吗所以我可以看到语法?使用关键路径可以更有效地进行平均计算<代码>NSNumber*平均=[fetchedObjects valueForKeyPath:@“@avg.amount”]。不,我指的是团队对比赛的“多对多”关系中比赛对象的平均属性值。例如,匹配对象有一个名为“penaltySmall”的属性,该属性是一个NSNumber。我希望检索团队“对多”关系中的所有匹配对象,并返回所述团队中匹配的平均“penaltySmall”浮点值