web-dev-qa-db-ja.com

新しいオブジェクトを挿入するiPhoneコアデータ

私はコアデータのドキュメントを読んでいますが、まだ何かが足りないと感じています。

オブジェクトを別のオブジェクトの関係に挿入する方法がよくわかりません。

たとえば、次の2つのエンティティが私のモデルに含まれています

flightDepartureBoard
 name: 
 from_airport:
 to_airport:
 current_flights: (this is a one to many relationship of flight detail entities)

flight_details
 arrive
 depart
 name

したがって、私のデータには、いくつかの空港のさまざまな出発ボードのリストが含まれています。各出発ボードには、その空港の現在の到着と出発に関する情報を含む多数のflight_detailsが含まれています。

私の現在の理解は、特定の出発ボードのフライトの詳細を挿入することです。ボードのmanagedObjectを取得し、フライトごとに新しい管理オブジェクトを作成し、必要に応じてその値を設定してから、フライト管理オブジェクトを含むNSSetを作成して設定する必要があります。作成されたばかりのNSSetへのdepatureboardsmanagedObject current_flights(関係)。これは正しいです?

新しいエントリを追加したい場合はどうすればよいですか?最初にセット全体をフェッチする必要はないと思いますか?

助けてくれてありがとう。


代わりに、flightDetailsオブジェクトの現在のオブジェクトとの関係を設定できることに気づきました。

18
J T

データモデルで関係を定義すると、セットは含まれているオブジェクトのヘッダーで定義されます。通常のNSMutableSetメソッドを使用して、セットにアイテムを追加またはセットから削除するだけです。

新しい管理対象エンティティを追加するには、次のようにします。

Task* newTask = [NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext];

AppleからLocationサンプルを取得し、そこから作業する場合、関係は含まれていませんが、パズルを解きます。すべてを機能させるには、データモデルを必要なものに変更して実行します。関係とは考えないで、「AにはBのNSMutableSetがある」と考えてください。ドキュメントで推奨されているように逆の関係を定義したので、BがAについて何を持っているかを考える必要はありません。考え始めてください。それがあなたにとって重要なオブジェクトであるとき、Bに関して。

Boardオブジェクトを持つAirportオブジェクトがあるとします(そして、変数routingArrayを使用して出発地と目的地をFlightに設定し、必要に応じてFlightオブジェクトを作成し、次のような関係を設定するとします。

Flight* newFlight = [NSEntityDescription insertNewObjectForEntityForName:@"Flight" inManagedObjectContext:self.managedObjectContext];
[newFlight setRoute:routingArray];
[Airport.Board.flights addObject:newFlight];

フライトがキャンセルされたとき(あなたを呪う、ユナイテッド!)、そのセットからフライトを削除するだけで、以前はnilと表示されていたオブジェクトにアクセスしようとすると、乗客の日を元気に台無しにすることができます。

25
Adam Eberbach

いくつかのオプションがあります:
1。 NSManagedObjectでadd<Key>Object:を使用できます。

NSManagedObject *flightBoard = [NSEntityDescription insertNewObjectForEntityForName:@"FlightDepartureBoard" inManagedObjectContext:self.managedObjectContext];
NSManagedObject *details = [NSEntityDescription insertNewObjectForEntityForName:@"Flight_Details" inManagedObjectContext:self.managedObjectContext];
[flightBoard addCurrent_flightsObject:details];

カテゴリでアクセサを定義しない限り、コンパイラの警告が表示されます。

@interface NSManagedObject (Current_flightsAccessors)
- (void)addCurrent_flightsObject:(NSManagedObject *)value;
- (void)removeCurrent_flightsObject:(NSManagedObject *)value;
- (void)addCurrent_flights:(NSSet *)value;
- (void)removeCurrent_flights:(NSSet *)value;
@end

2.サブクラス。モデルからクラスファイルを生成できます。これには、to-many関係のアクセサーが含まれます。

FlightDepartureBoard.h:

#import <CoreData/CoreData.h>
@class Flight_Details;
@interface FlightDepartureBoard : NSManagedObject 
{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * from_airport;
@property (nonatomic, retain) NSString * to_airport;

@interface FlightDepartureBoard (CoreDataGeneratedAccessors)
- (void)addCurrent_flightsObject:(Flight_Details *)value;
- (void)removeCurrent_flightsObject:(Flight_Details *)value;
- (void)addCurrent_flights:(NSSet *)value;
- (void)removeCurrent_flights:(NSSet *)value;
@end

FlightDepartureBoard.m:

#import "FlightDepartureBoard.h"
#import "Flight_Details.h"
@implementation FlightDepartureBoard
@dynamic name;
@dynamic from_airport;
@dynamic to_airport;
@dynamic current_flights;
@end

3.可変セットを取得し、mutableSetValueForKey:を使用して変更できます。例えば:

NSManagedObject *flightBoard = [NSEntityDescription insertNewObjectForEntityForName:@"FlightDepartureBoard" inManagedObjectContext:self.managedObjectContext];
NSManagedObject *details = [NSEntityDescription insertNewObjectForEntityForName:@"Flight_Details" inManagedObjectContext:self.managedObjectContext];
NSMutableSet *flights = [flightBoard mutableSetValueForKey:@"current_flights"];
[flights addObject:details];

詳細については、 Managed Object Accessor Methods を確認してください。

25
gerry3