我一直在阅读核心数据文档,觉得我还在遗漏一些东西。
我不太明白如何将对象插入到另一个对象的关系中。
例如,我的模型中有以下两个实体
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,其中包含有关该机场当前到达和离开的信息。
我目前的理解是插入特定出发板的航班详细信息,我必须获取每个航班的托管对象,然后为每个航班创建一个新的托管对象并根据需要设置其值,然后创建一个包含航班托管的NSSet对象并将depatureboards managedObject current_flights(关系)设置为刚刚创建的NSSet。这是对的吗?
如果我想添加新条目怎么办?我假设我不需要先获取整个集合?
感谢您的帮助..
虽然我刚刚意识到我可以设置与flightDetails对象上当前对象的关系而不是..
答案 0 :(得分:25)
在数据模型中定义关系时,该集合在包含对象的标题中定义。只需使用常规NSMutableSet方法在集合中添加或删除项目。
要添加新的托管实体,您将执行以下操作:
Task* newTask = [NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext];
如果您从Apple获取位置示例并从那里开始工作,您会将其解开,尽管它不包含任何关系。为了实现这一切,只需将数据模型更改为需要的数据模型,不要将其视为关系,只需将其视为“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];
当航班被取消(诅咒你,曼联!)时,您可以从该组中删除航班以及任何试图访问过去曾经看到的对象的人,这样您就可以高兴地毁掉乘客的一天。 / p>
答案 1 :(得分:25)
有几个选择:
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。子类。您可以从模型中生成类文件,其中包含多对多关系的访问器:
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。