核心数据:Subclassed NSManagedObject和Relationships

时间:2012-10-25 19:56:06

标签: ios core-data nsmanagedobject

我为一个人和一个公司创建了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方法 - 这个方法看起来怎么样?

我想做的是能够在应用程序的稍后阶段将所有人员召集回公司。我确实考虑过使用谓词和外键以及沟渠关系来做这件事,但那就是我让自己处于错误的心态,这是一个数据库,而事实并非如此。

1 个答案:

答案 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,但是你仍然可以使用点符号。

另外,请注意核心数据会为您生成一些访问方法。