具有密钥路径收集的核心数据SUBQUERY导致SQL错误

时间:2015-12-10 22:32:33

标签: sql core-data

我遇到来自Core Data生成的查询的SQL错误。这是数据模型:

Data Model

我想得到所有公共汽车都有活跃乘客的司机。这可以通过以下获取请求和谓词来简单描述,它起作用:

NSFetchRequest(entityName: "Driver")
NSPredicate(format: "ANY bus.passengers.active == YES")

但是,假设我想对乘客进行更复杂的查询,比如他们都是活跃的,并且余额都在100以上。要做这样的查询,我必须使用SUBQUERY,就像这样:

NSPredicate(format: "SUBQUERY(bus.passengers, $passenger, $passenger.active == YES 
AND $passenger.balance > 100).@count > 0")

我希望SUBQUERY接受一个keypathed集合作为它的第一个参数。它生成以下SQL查询:

SELECT 0, 
       t0.z_pk, 
       t0.z_opt, 
       t0.zbus 
FROM   zdriver t0 
WHERE  (SELECT Count(t2.z_3passengers) 
        FROM   zbus t1 
               JOIN z_1passengers t2 
                 ON t1.z_pk = t2.z_1busses 
        WHERE  ( t0.zbus = t1.z_pk 
                 AND (( t2.zactive = ? 
                        AND t2.zbalance > ? )) )) > ? 

错误:'no such column: t2.ZACTIVE'。看起来它在JOIN表上缺少ZPASSENGER

这是一个核心数据错误还是有不同的方法来编写这个谓词?

更新: Here's a sample project可以重现此问题。

1 个答案:

答案 0 :(得分:-1)

尝试获取Bus实体,避免SUBQUERY中第一个参数中的关键路径。

正如所指出的,这可以被视为限制或错误。

<强>更新
进一步的研究表明,你的子查询谓词应该真正起作用。我建议您检查NSManagedObject子类,并确保passengers返回一个集合,active已正确列为属性。