25

フェッチされたプロパティを数回使用しようとしましたが、正しいアプローチのように見えますが、うまくいきません。

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

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

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

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

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

4

3 に答える 3

30

関連するコードは次のとおりです(すでに言及したビットを含む):

私の例には、'Stats' オブジェクトと 1->many の関係を持つ 'Card' オブジェクトがあります。各「統計」オブジェクトには、1 ~ 4 の「結果」があります。私の取得したプロパティは、'Card' オブジェクトに 'outcome'=1 のみの 'Stats' オブジェクトの配列を与える単純なものです。

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

そこで、'Card' オブジェクトに、取得したプロパティ 'statsOfTypeOne' を配置し、Destination を 'Stats' に設定しました。

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

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

「SELF」は「統計」レコードであり、実行されると $FETCH_SOURCE は魔法のように「カード」オブジェクトになります。

あなたがしたように、「Card」オブジェクトの .h および .m ファイルに次を入れました。

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

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

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

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

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

ピーター

于 2011-10-28T16:36:43.057 に答える
5

@ピーターの答えに追加します。Swift 2.0 と Xcode 7 で動作させる方法は次のとおりです。

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]
于 2015-08-04T08:04:13.103 に答える