2016-08-16 48 views
0

我在尋求幫助瞭解NSPredicates以及如何查詢CoreData。這裏是我有什麼:如何針對CoreData中的多個關係執行復合查詢

我有兩個實體:1.捕獲,表示一個「捕獲」的一些數據,它有許多關係2.身份標籤。

我期待從一組特定的「捕捉」中獲得一組「身份」標籤。即我想知道名稱'X'的所有唯一身份標識,這些標識也用Int'y'的標識標記。

在SWIFT我會對此建模,如:

let captures: [Capture] 
let identities = captures.flatmap({ $0.identities }).filter({ $0.id == "y" }) 
let uniqueIdentitiesOfParticularType: Set<Identity> = Set(identities.flatMap({ $0.name }) 

任何幫助嗎?

回答

1

首先,肯定從Predicate Programming Guide開始,其中涵蓋了更多詳細信息。特別參見「在覈心數據中使用謂詞」。

你的解決方案是沿着這些線路可能的東西,如果你想成爲一個有點小心斷層:

let request = NSFetchRequest(entityName: "Capture") 
let id = "y" 
request.predicate = NSPredicate(format: "id == %@", id) 
let identities = try context.executeFetchRequest(request) as NSArray 
let names = identities.valueForKeyPath("@distinctUnionOfObjects.name") 

需要注意的是iOS的10增加了這一斯威夫特更好橋(你可能不需要as NSArray),但我還沒有真正探索過它們。

欲瞭解更多關於@distinctUnionOfObjects及其朋友,請參閱Collection Operators

+0

感謝羅!這讓我走上了正軌。我猜想我可能會有更好的方法告訴CoreData一次性獲取這些對象,因此我試圖弄清楚如何讓NSPredicates完成所有工作。 – Bren

+0

只要記住Core Data不是數據庫。它的目的不是任意記錄查詢。它是一個對象持久性引擎。它的目的是維護一個一致的對象圖。 「獲取」僅僅是一個實現細節,因爲數據集可能並不都適合內存。核心數據的主要功能是幫助您導航複雜的關係系統,而不是「查詢行」。如果你有許多獨立的記錄沒有很多固定的關係,我經常會發現一個數據庫是更好的工具。 –

+1

我明白了......對於我正在處理的這個小項目,我有一個本地存儲在JSON中的數據集。 CoreData提供了一種很好的方式來將這些數據序列化到適當的對象中,保持它們彼此之間的關係,並與它們進行交互。我想,在探索這個解決方案時,我可能會試圖過度設計思考,有一種更好的方法,然後查看獲取所返回的所有對象。 – Bren