核心数据提取结果减少相关项目集

Posted

技术标签:

【中文标题】核心数据提取结果减少相关项目集【英文标题】:Core Data Fetch Results Reduced Set of Related Items 【发布时间】:2014-08-05 23:01:58 【问题描述】:

我有一个 NSFetchResult,它返回包含许多相关对象(Aobj ->> Bobj)的托管对象。 “Bobj”托管对象包含一个 BOOL 属性“isSet”(存储为 NSNumber)。 NSFetchResult 返回所有 Aobj 对象。

我想要一个 NSPredicate 的建议,它只返回一个 Aobj,其中只有那些 isSet 为 TRUE (@1) 的 Bojs。

目前,我枚举了我的 fetch 结果返回的 Aobj 的 NSArray,以便我可以通过这种方式获得过滤后的 Aobj 的 NSArray:

- (NSArray *)filteredObject:(Aobj *)aObj

    NSMutableArray* bObjs  = [aObj.bObjs mutableCopy];

    [bObjs enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Bobj* bObj, NSUInteger idx, BOOL *stop)
     
         if (bObj.isSet == [NSNumber numberWithBool:NO])
         
             [bObjs removeObject:story];
         
     ];
    return bObjs;

问另一种方式:如何为我的 NSFetchResult 定义一个 NSPredicate 来获取我所有的 Aobj,但将相关的 Bobjs 限制为匹配 Bobj.isSet == YES 的那些?

提前致谢!

【问题讨论】:

【参考方案1】:
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF.bObjs.isSet == YES"];
[myFetchRequest setPredicate:myPredicate];
NSArray *array = [moc executeFetchRequest:myFetchRequest error:&error];

【讨论】:

不幸的是,此解决方案会产生“未捕获的异常 'NSInvalidArgumentException',原因:'to-many key not allowed here'”错误。 我们可以尝试从核心数据中获取所有数据,然后使用 NSPredicate。替换代码中的过滤对象:方法,尝试 NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF.isSet == YES"]; return [aObj.bOBjs filteredArrayUsingPredicate:myPredicate]; 感谢钦马亚!第二个谓词完成了这项工作。【参考方案2】:

使用子查询。子查询遵循以下通用格式:

SUBQUERY(relationship, related_thing, predicate)

relationship 是被评估对象的关系。 related_thing 是关系中的单个对象。它以 $ 为前缀,然后在谓词中使用(为清楚起见,上面未显示)。 predicate 是应用于related_thing 的谓词。

以您的示例为例,它看起来像(假设您的关系称为“bobjs”):

SUBQUERY(bobjs, $obj, $obj.isSet == YES)

子查询可能非常强大。例如,您还可以将集合运算符应用于子查询:

SUBQUERY(bobjs, $obj, $obj.isSet == YES).@count > 1 将为您提供每个 AObj,该 AObj 至少有一个在 isSet 等于 YES 的 'bobjs' 关系中的对象。显然,您可以在此基础上使用其他集合运算符或层逻辑运算或附加表达式。

【讨论】:

嗨奎利什。我应该提到我尝试了两种选择。第一个给我一个无法解析谓词的错误。正如您所说,第二个结果仅返回具有至少一个如此标记的 Bobj 的 AObj,但它仍然返回与 AObj 相关的所有 Bobjs。也就是说,如果 AObj 的一个实例有 10 个相关的 Bobjs,并且这些 Bobjs 中只有 4 个被标记为 .isSet = YES,那么我希望返回的 Aobj 只包含 NSSet 中包含的这 4 个 Bobjs。 不确定你在这里的意思:“那么我希望 Aobj 返回只包含 NSSet 中的那 4 个 Bobjs。”您希望 Aobj 上的关系仅包含具有 obj.isSet == YES 的对象吗?在查询中做不到的,在Aobj的实现中就可以做到。 这是第一个替代方案产生的错误:未捕获的异常'NSInvalidArgumentException',原因:'无法解析格式字符串“SUBQUERY(Bojs, $x, $x.isSet == %@) “”。 (无论 isSet == %@、@1、YES 还是 @YES 都会发生。)

以上是关于核心数据提取结果减少相关项目集的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)使用rotate参数指定进行正交旋转提取因子使用nfactors参数指定抽取的因子个数fa函数因子分析结果解读

R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)使用rotate参数指定进行斜交旋转提取因子使用nfactors参数指定抽取的因子个数fa函数因子分析结果解读

linq 更改结果集的值

机器学习的相关算法了解和总结

机器学习的相关算法了解和总结

机器学习的相关算法了解和总结