web-dev-qa-db-ja.com

誰かがコアデータのフェッチされたプロパティの実用的な例を持っていますか?

フェッチされたプロパティを数回使用しようとしましたが、これは正しいアプローチのようですが、決しては機能しません。

最近の試みでは、fetched-propertyをエンティティに追加し、モデル内の他のエンティティを「宛先」として選択し、述語を有効であることがわかっている条件に設定しました。

問題1:エンティティのNSManagedObjectクラスが生成されると、フェッチされたプロパティの何も含まれません。いくつか検索した後、.hファイルに宣言を追加し、.mファイルに@dynamicステートメントを追加しました(はい、NSArray *タイプであることがわかります)。

問題2:その後も、コードでこのプロパティにアクセスすると、フェッチ要求にエンティティがないことを示す例外がスローされます。 「エンティティ」は「宛先」として指定されたものであると想定しており、実際にはそこにあります。

そこで、フェッチされたプロパティがモデルで定義され、NSManagedObjectから派生したクラスで宣言され、実際にコードから使用される具体的な作業例(iOSプラットフォーム)を誰かに提供してもらいたいと思います。

この時点で、私はこの時間の浪費をあきらめ、フェッチ要求コードを自分で実装するだけです。

22
user576924

これが私の関連するコードのビットです(あなたがすでに言及したビットを含む):

私の例には、「Stats」オブジェクトと1->多くの関係がある「Card」オブジェクトがあります。各「Stats」オブジェクトには、1〜4の「結果」があります。フェッチされたプロパティは、「Card」オブジェクトに「outcome」= 1のみの「Stats」オブジェクトの配列を与える単純なプロパティです。

フェッチされたプロパティを使用して、特定の数と種類を超える「Stats」オブジェクトを持つ「Card」オブジェクトを簡単に取得できるようにしたかったのです。

そのため、「Card」オブジェクトに、Destinationを「Stats」に設定して、FetchedProperty「statsOfTypeOne」を配置しました。

このフェッチされたプロパティの述語に

(SELF.outcome=1) AND (SELF.card=$FETCH_SOURCE)

'SELF'は 'stats'レコードであり、$ FETCH_SOURCEは実行時に魔法のように 'Card'オブジェクトになります。

あなたがしたように、私は 'Card'オブジェクトの.hファイルと.mファイルに以下を入れました:

@property (nonatomic, retain) NSArray *statsOfTypeOne;
@dynamic statsOfTypeOne;

次に、私のコードで使用しました:

[self.managedObjectContext refreshObject:cardInstance mergeChanges:YES];
[cardInstance valueForKey:@"statsOfTypeOne"]

配列を取得します(ただし、cardInstance.statsOfTypeOneで問題ありません)。更新オブジェクトがないと、Fetchedプロパティは更新されませんでした(マニュアルによる)。

考えるそれは私がそれを機能させるためにしたすべてです。それがあなたのために働くかどうか私に知らせてください。

ピーター

26
Peter

@Peterの答えに追加します。 Swift 2.0およびXcode7で動作させる方法は次のとおりです。

import Foundation
import CoreData

@objc(Card)
class Card: NSManagedObject {

    @NSManaged var statsOfTypeOne: [Stat]

}

次に、フェッチされたプロパティを読み取るには:

managedObjectContext.refreshObject(someCard, mergeChanges: true)
// This works and returns [Stat] type
someCard.statsOfTypeOne
// So does this
someCard.valueForkey("statsOfTypeOne") as! [Stat]
5
Benjamin Cheah

この前の質問をご覧になりましたか: Xcode 4コアデータ:データモデルエディターで作成されたフェッチされたプロパティの使用方法

受け入れられた回答とすべてのコメントを読んでください。彼らはそれを整理したようです。

2
sosborn