2016-08-16 11 views
0

NSPredicateの理解とCoreDataのクエリ方法を理解する上で助けが必要です。私が持っているものは次のとおりです。CoreDataの多くのリレーションシップに対して複合クエリを実行する方法

私は2つのエンティティを持っています:1.いくつかのデータの "キャプチャ"を表し、それは2.アイデンティティタグと多くの関係を持っています。

私は基本的に "キャプチャ"の特定のセットから "アイデンティティ"タグのセットを取得しようとしています。つまり、Int 'y'というIDでタグ付けされたキャプチャの名前「X」のすべての一意のIDを知りたいとします。

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から始めてください。特に「コアデータで述語を使用する」を参照してください。

あなたのソリューションは、あなたが断層運動について少し慎重になりたい場合は、これらの線に沿って何かありそうです:iOSの10はスウィフトに、このためのより良い橋を追加することに

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") 

注意(あなたがas NSArrayを必要としないかもしれない)が、私はまだそれらを実際に探検していない。

@distinctUnionOfObjectsおよびその詳細については、Collection Operatorsを参照してください。

+0

ありがとうRob!これは正しい軌道に乗った。私は、CoreDataにこれらのオブジェクトを1つのフェッチに伝えるより良い方法があると思ったので、NSPredicatesをすべての作業を行う方法を理解しようとしていたのです。 – Bren

+0

コアデータはデータベースではないことを覚えておいてください。それは目的は任意のレコードクエリではありません。それはオブジェクト永続化エンジンです。一貫したオブジェクトグラフを維持するのが目的です。データセットがすべてメモリに収まるわけではないため、「フェッチ」は実装の詳細です。コアデータの主力は、「行のクエリ」ではなく、複雑な関係システムのナビゲートを支援することです。多くの固定された関係がない多くの独立した記録がある場合、私はしばしばデータベースをより良いツールと見なします。 –

+1

私はこの小さなプロジェクトのために私が働いている私は、JSONにローカルに格納されているデータセットを持っています。 CoreDataは、このデータを適切なオブジェクトにシリアライズし、相互に関連する方法を維持し、それらとやり取りするための素晴らしい方法を提供しました。私はこのソリューションを検討するにあたって、フェッチによって返されたすべてのオブジェクトを見ているより良い方法があると思っていたのではないかと思っていました。 – Bren

関連する問題