2013-04-29 10 views
11

誰もCoreDataで過渡に-1 関係をモデルとコードする方法についての例がありますか?たとえば、1対多の関係を持つ2つのエンティティがあります。医師とアポイントメント。今、私は、医師団体のmostRecentApplicationという一時的な関係が必要です。 xcodeデザイナーでモデル化するのは簡単ですが、実装側についてはわかりません。また、私は逆を実装する必要がありますか?愚かなようだ。CoreData過渡的関係の例

+0

かなり確信して一時的な関係をサポートしていないので、手動で組み込む必要があります。これはあなたの質問に直接答えないかもしれませんが、 'mostRecentAppointment'関係を実装する最も簡単な方法は、データアクセス層クラスにメソッドを作成し、日付desc述語が – Eugene

+0

Hmmの' NSFetchRequest'で取得することです。設計者は、関係を一時的なものとしてタグ付けすることを許可します。だからそこに何かがあるように見えるだろう。私はオブジェクトにアクセスするたびにfetchrequestを実行したくないので、それに付属のKVOとキャッシングを利用しようとしています。通常の一時的なプロパティのようなものがあります。 – batkuip

+0

こんにちは。あなたは問題を解決しましたか?私はそのように解決する[関連する問題](http://stackoverflow.com/questions/42812151/core-data-fetch-with-predicate-of-transient-relationship-nil)それは一時的な関係が動作しないようだ期待される。 – LShi

答えて

2

あなたがしなければならないことは、newAppointmentというタイプのAppointmentというエンティティを追加し、指定された医師の新しい予定を作成するたびにこれを設定することです。それは簡単です。

アップルが常に検証とコアデータの効率化のためにこれを推奨しているように、インバースをインプリメントしてください。

また、予定にタイムスタンプを付け、NSPredicatesを使用して、特定の医師のリンクされた予定で最新の予定を検索することもできます。

まず、あなたは(つまり、他のオブジェクト型へのご過渡特性ポイント場合に気づく、あなたのモデルに過渡特性を定義します。

+0

KVOサポートはどうですか?むしろ、通常の一時的なプロパティのようなCoreDataフレームワークを活用しています。 – batkuip

+0

これは本当ですが、ここではほとんどの場合、実際の予定と医師とをリンクする必要があります。それが最も最近の予定であることを考えると、私はKVOが良いアプローチだと同意しますが、この例では過度の可能性があります。 – Dev2rights

+0

これは例です。私のアプリはもう少し複雑です。だからKVOは便利です。リレーションシップは保存されないため(一時的な)、アプリケーションの起動時にどのようにリンクを再確立しますか? – batkuip

6

は、私がNSManagedObjectで画像をキャッシュするために、最近書​​いたこのコードを見てくださいあなたがモデルに「Undefined」として残しておきますCoreDataでサポートされているもの以外)

enter image description here

その後、あなたはNSManagedObjectのサブクラスは、そのエンティティのために再生成したり、単に、手動でヘッダーを新しいプロパティを追加ファイルには、次のようになります。

@interface Card : NSManagedObject 

@property (nonatomic, retain) NSString * imagePath; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSNumber * order; 
@property (nonatomic, retain) NSString * displayName; 
@property (nonatomic, retain) UIImage *displayImage; 

@end 

ここでは、実際のクラス型

例えばへの過渡特性のクラスを変更しますdisplayImageタイプはこちらUIImageです。実装ファイル(または拡張クラス)では

あなたは過渡プロパティのgetter/setterメソッドを実装します。あなたを助けます

-(UIImage*)displayImage{ 

    //Get Value 
    [self willAccessValueForKey:@"displayImage"]; 
    UIImage *img = (UIImage*)[self primitiveValueForKey:@"displayImage"]; 
    [self didAccessValueForKey:@"displayImage"]; 

    if (img == nil) { 
    if ([self imagePath]) { //That is a non-transient property on the object 
     img = [UIImage imageWithContentsOfFile:self.imagePath]; 
     //Set Value 
     [self setPrimitiveValue:img forKey:@"displayImage"]; 
    } 
    } 
    return img; 
} 

希望。

+2

私はこれを行う方法を知っています。キャッシュの無効化とフォールトに対処する必要がある場合には、これより少し複雑です。関係なく、私の質問はプロパティではなく、一時的な関係についてでした。一時的な関係についてはそこに情報がほとんどない。したがって、私はこの質問を投稿します。たとえば、通常の1対多の関係(通常のアポイントメントを追加)に追加または削除されたときにキャッシュの無効化を処理する方法。 – batkuip

0

これは、自分のサンプルプログラムで試してみると、1時間以内に正しくセットアップすることができます。

私の推測では---余分なコーディングは必要ありません。 CoreDataに関するAppleの文書が正しい場合、通常の属性/関係と "一時的な"属性の唯一の違いは、後者が永続化されないということです。つまり、永続ストアを更新しないときに保存します。

KVO/KVC準拠、元に戻すサポート、検証、および削除ルールによる自動更新とともに、それ以外のすべての側面が完全であると思います。唯一のことは、エンティティのフレッシュフェッチ後のことです。一時的な関係は常にゼロになります。

---私はもちろん、ほとんどのエンティティではほとんどの時間がnullになる可能性が高いため、一時的な関係を「非オプション」として設定することを推奨しません。

逆の関係(過渡的でも賢明な名前でも)を設定し、両方の削除ルールを「Nullify」にします。

これまでのところ、過渡的な関係があります。

しかし、ここで私が思いついた、ほぼ同じ問題を解決しようとしています。私の「アポイントメント」は、関連する予定の一つですが、「最新のもの」だけではなく、最初の「未完成のもの」です。非常に似たロジック。代わりに、過渡的な関係の

は、私はこのように、カテゴリに、NSManagedObjectのサブクラス発生した私の「ドクター」entitysに新しい計算されたプロパティを追加しました:

@interface XXDoctor (XXExtensions) 
/** 
@brief Needs manual KVO triggering as it is dependent on a collection. 
     Alternatively, you can observe insertions and deletions of the appointments, and trigger KVO on this propertyOtherwise it can be auto- 
@return the latest of the to-many appointments relation. 
**/ 
@property (readonly) XXAppointment *latestAppointment; // defined as the 
@end 

実装:

#import "XXDoctor".h" 
#import "XXAppointment.h" 
@implementation XXDoctor (XXExtensions) 
// this won't work because "appointments" is a to-many relation. 
//+ (NSSet *)keyPathsForValuesAffectingLatestAppointment { 
// return [NSSet setWithObjects:@"appointments", nil]; 
//} 
- (XXAppointment *) latestAppointment { 
    NSInteger latestAppointmentIndex = [self.appointments indexOfObjectPassingTest:^BOOL(XXAppointment *appointment, NSUInteger idx, BOOL *stop) { 
     *stop = (appointment.dateFinished == nil); 
     return *stop; 
    }]; 
    return (latestAppointmentIndex == NSNotFound) ? nil : [self.appointments objectAtIndex: latestAppointmentIndex]; 
} 
@end 
+1

申し訳ありませんが、あなたは本当に過渡的な関係を適切に実装する方法、私の質問に本当に答えていません。私はAppleのドキュメントでこのトピックについて多くを見つけることができませんでした。この特定のトピックのリンクがありますか? – batkuip

+0

しました。必要な実装はありません。あなたのNSManagedObjectサブクラスを再生成し、あなたが望むように使用する "一時的"として関係をチェックマークのみ。それ以上の実装はありません。特別な問題なしに、私のアプリケーションで1対1および多対多の関係を正常に使用しています。 –

+0

ああ、私のアプリでは、自分の過渡リレーションに逆リレーションを定義して、それらも過渡的に設定しました。アプリケーションで一時的な関係を使用した理由は、UndoManagerが通常のCoreDataの変更として扱い、正常に元に戻す方法を知っていることです。 –