3

コアデータがそのデータベースをどのように処理するかについて、私はいくつかのことを考え出すのに苦労しています。具体的な例を挙げて問題を説明します:コアデータの1対多の関係を管理するにはどうすればよいですか?

多くのアカウント(私たちのアドレス)を保持する部署がある場合は、次のスキーマがあるとしましょう。

エディタを使用してCore Dataファイルを作成しました。 CachedDepartmentクラスでは、必要な属性を追加してから、多対多関係を作成しました.CacheAccountの「Departmentプロパティ」に「Inverse」を選択しました.CacheAccountにも属性があり、アドレス」CachedDepartmentの関係

私は(私は残りのあなたに2つのヘッダファイルを与える興味のあるものを含まない。)以下のソースを持っている:

@interface CachedAccount : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSNumber * accountID; 
@property (nonatomic, retain) NSString * email; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) CachedDepartment *department; 
@end 

@class CachedAccount; 

@interface CachedDepartment : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSString * departmentID; 
@property (nonatomic, retain) NSString * departmentName; 
@property (nonatomic, retain) NSSet *addresses; 
@end 

@interface CachedDepartment (CoreDataGeneratedAccessors) 

- (void)addAddressesObject:(CachedAccount *)value; 
- (void)removeAddressesObject:(CachedAccount *)value; 
- (void)addAddresses:(NSSet *)values; 
- (void)removeAddresses:(NSSet *)values; 

@end 

そして今の質問:
- どのように。アカウントと部門オブジェクトを作成して1対多の関係が確立されるようにする必要がありますか?

- CoreDataGeneratedAccessorsで何をする必要がありますか?作成後、CachedDepartmentの-addAddressesObject関数を呼び出すか、anAccount.department = aDepartmentのようなものを作成する必要があります。

- それぞれの場合でオブジェクトを作成するときに、部門に住所を追加することで住所の二重インスタンスが作成されず保存されないようにするにはどうすればよいですか?

私はこのことについて洞察を深めることができます。

EDIT:

は、次のコードのようなCachedDepartmentエンティティ一見のための新しいオブジェクトを挿入する必要があります。

NSManagedObject *cachedDepartment= [NSEntityDescription 
    insertNewObjectForEntityForName:@"CachedDepartment" 
    inManagedObjectContext:[self managedObjectContext]]; 
/* 
set values for failedBankInfo here 
*/ 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"The following error occured: %@", [error localizedDescription]); 
} 

が、その後で1対多の関係になりますcachedAccountsのための新しいレコードを追加します新たに挿入されたcachedDepartmentオブジェクトは、そのようなものになる:

NSManagedObject *cachedAccounts = [NSEntityDescription 
    insertNewObjectForEntityForName:@"CachedAccounts" 
    inManagedObjectContext:[<b>cachedDepartment managedObjectContext</b>]]; 
    /* 
    set values for failedBankInfo here 
    */ 
//setting the one-to-many relationship 
[cachedDepartment addCachedAccountObject:cachedAccount]; 
[cachedAccount setCachedDepartment:cachedDepartment]; 
// 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@" couldn't save: %@", [error localizedDescription]); 

答えて

4

どのようにすべき1対多の関係が確立されるようにn個のアカウントオブジェクトと部門オブジェクトが作成されますか?

コアデータは、モデルで設定した場合、逆関係が自動的に設定されます。だから、あなたのコードをどのように構造化しているかによって、newAccount.department = aDepartment;を置くことができ、あなたの関係と逆も作成されます。

CoreDataGeneratedAccessorsは?作成した後、私はCachedDepartmentの-addAddressesObject関数を呼び出す必要があるか、私はanAccount.department = aDepartmentような何かを行う必要がありますし、それはそれをだと私は何をすべき?

はい、それです。前の副回答を参照してください。生成されたアクセサは、あなたのプログラムの流れによって逆の作業をするのがより賢明になる場合や、逆の関係を定義していない場合に備えています。

代わり

anAccount.department = aDepartment; 

[aDepartment addAddressesObject:anAccount]; 

を行うことができますが、両方を行う必要はありません。私は部門にアドレスを追加すると、アドレスの二重のインスタンスを作成し、それを保存しないことを確認することができますどのようにそれぞれの場合に

オブジェクトを作成

あなたコール両方の方法を行った場合、これは関係がNSMutableSetとして保存され、あなたが複数回セットに同じオブジェクトを追加することができないので、何の効果もないだろう。

+0

ありがとうございました!もう1つのことは、managedObjectContext(私の質問でEDITをチェック)を使用する方法です。 ご覧のとおり、[cachedDepartment managedObjectContext]を使用します。 – 32l3n

+0

これは同じです。あなたのアプリケーションには管理対象オブジェクトのコンテキストが1つしかありません(もっと多くのことができますが、今の段階ではそうは思いません!)ので、部門オブジェクトからのものを使用するか、同じオブジェクトの中にいれば、大丈夫です。 – jrturton

関連する問題