我为一个人和一个公司创建了NSManagedObjects的子类。在核心数据中,我已经建立了双向关系(一个是人与公司之间的一个名为personCompany,另一个是围绕companyPerson)。我的应用程序可以很好地保存人员和公司,他们的头文件看起来如下(为了演示目的大量简化):
#import <CoreData/CoreData.h>
@interface BBPerson : NSManagedObject
@property (nonatomic) NSString *firstName;
@property (nonatomic) NSString *lastName;
@end
----------------------
#import <CoreData/CoreData.h>
@interface BBCompanyName : NSManagedObject
@property (nonatomic) NSString *companyName;
@end
在我的“添加人员”视图控制器中,部分保存方法如下所示。
//If this is a new person, best add a person
if (!currentPerson) {
currentPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:managedObjectContext];
}
//Write the values back to the entity
currentPerson.firstName = txtFirstName.text;
currentPerson.lastName = txtLastName.text;
**//I WANT TO DO THE BELOW: but clearly can't**
//[currentPerson setCompany:selectedCompany];.
//Save back to core data
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}
如果我在这里引用了另一个公司(在上面显示为selectedCompany),如何更改我的子类NSManagedObject以添加此关系?我看过the documentation,我仍然有点漂亮。
我想要做的是,使用我的子类NSManagedObject创建一个可以持久化的关系。类似[currentPerson setCompany:selectedCompany];这当然需要currentPerson方法 - 这个方法看起来怎么样?
我想做的是能够在应用程序的稍后阶段将所有人员召集回公司。我确实考虑过使用谓词和外键以及沟渠关系来做这件事,但那就是我让自己处于错误的心态,这是一个数据库,而事实并非如此。
答案 0 :(得分:1)
您希望在核心数据编辑器中设置实体(在项目导航器中选择xcdatamodel时出现)。
为Person和Company实体添加name,phoneNumber等属性。
然后,对于Company实体,在关系下,添加名称为people,destination Person的关系。选中该关系后,在数据模型检查器窗格中,勾选显示多对多关系的框。对于Person实体,添加一个名为company的关系,将其目标设置为Company,并将其与people相反。
从项目导航器中删除NSManagedObjectModel子类。创建一个新文件,然后从左侧菜单中选择Core Data。选择托管对象子类。它会询问您要为其生成实体的数据模型。选择数据模型以及要为(Person和Company)生成NSManagedObject子类的实体。
然后,您可以查看Xcode为您创建的标头和实现文件,您将看到为实体设置的属性已在头文件中声明为属性,并且在实现中它们都被标记为动态。更重要的是,公司与个人之间的一对多关系也是如此。您将在Company.h中看到公司有一个@property人员,这是一个NSSet。这在您的实现中也标记为@dynamic。 @dynamic不像@synthesize那样为你创建getter和setter,但是你仍然可以使用点符号。
另外,请注意核心数据会为您生成一些访问方法。