【问题标题】:What's better way to build NSPredicate with to-many deep relationships?有什么更好的方法来构建具有多个深层关系的 NSPredicate?
【发布时间】:2011-01-01 16:35:36
【问题描述】:

我有三个实体:EntityA、EntityB 和 EntityC,它们与多对多关系相连。

详见架构:

alt text http://img706.imageshack.us/img706/9974/screenshot20091220at124.png

为了获取依赖于 EntityB.name 的 EntityA 的所有实例,我使用如下谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"];

获取依赖于 EntityC.name 的所有 EntityA 实例的谓词应该是什么? 我尝试像@"ANY EntityB.entitiesC.name like 'SomeName'" 这样的查询,但得到异常"multiple to-many keys not allowed here"

最好的问候,

维克多

【问题讨论】:

    标签: iphone core-data nspredicate


    【解决方案1】:

    我的最终解决方案是使用 SUBQUERY。

    NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@).@count)).@count)", nameA, nameC];
    

    很遗憾,我无法在 nsExpression 对象上展开此查询。

    【讨论】:

    • 这是否适用于 Mac OS 和 iOS 的 SQLite 商店?来自 Apple 文档(来自 iOS 5.0 库:Core Data Programming Guide > Persistent Store Features > Fetch Predicates and Sort Descriptors - Mac OS 可能不同):“您可以在 SQLite 商店中使用的谓词有额外的限制:您不一定将“任意”SQL 查询转换为谓词。”
    【解决方案2】:

    当我被以下决定阻止时:

    首先,我得到所有满足条件 EntityC.name 等于 'SomeName' 的 EntityC

    NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName];
    

    ...

    NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    

    然后我从上面的查询中得到一个 EntityB 数组

    NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"];
    

    获取满足条件 EntityB.EntitiesC.name 等于 'SomeName' 的 EntityB 数组:

    NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject];
    NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs];
    
    NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];
    

    我对 EntityA 重复同样的操作。

    这个解决方案的有效性值得怀疑,我仍然期待这个问题有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多