2015-12-10 40 views
1

我遇到核心數據生成的查詢中的SQL錯誤。這裏的數據模型:核心數據SUBQUERY與鍵路徑集合導致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)[email protected] > 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'。看起來它在ZPASSENGER表中缺少JOIN

這是一個核心數據錯誤還是有不同的方式來編寫這個謂詞?

更新:Here's a sample project重現此問題。

+0

不知道爲什麼這不起作用,但您可以嘗試提取「總線」實體,縮短關鍵路徑。請讓我們知道這是否有效。 – Mundi

+0

在我看來,就像一個*限制*,而不是一個錯誤。 – Mundi

+0

我認爲沒有什麼比@ Mundi在'Bus'上提取的建議更好。我會向Apple提交一份關於此問題的錯誤報告,因爲即使這是一個限制,也應該修復。 –

回答

-1

嘗試獲取Bus實體,避免在SUBQUERY的第一個參數中的關鍵路徑。

正如所指出的,這可以被看作是一個限制或一個錯誤。

更新
進一步的研究表明,你的子查詢謂詞應該實際工作。我建議您檢查您的NSManagedObject子類,並確保passengers返回一個集合,active已正確列爲屬性。

+0

我確實可以獲取'Bus'實體,但那不是我正在尋找的東西。這是我的實際代碼的簡化版本。這個提取請求被用在'NSFetchedResultsController'中,而實際的謂詞在'Driver'實體上有其他查詢。 –

+0

我也不同意它可以算作一個限制,因爲它會導致SQL錯誤而不是核心數據錯誤。 –

+0

如果它是'Driver'和'Bus'之間的一對一關係,那麼** **可以獲取'Bus'實體併爲謂詞使用'driver'屬性。 – Mundi