1

我将 NSManagedObjects 子类化为 Person 和 Company。在核心数据中,我使用两种方式建立了这些关系(一种从个人到公司,称为 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 以添加此关系?我查看了文档,但我仍然有点飘忽不定。

我想用我的子类 NSManagedObject 创建一个可以持久的关系。类似 [currentPerson setCompany:selectedCompany]; 这当然需要 currentPerson 一个方法 - 这个方法看起来如何?

我想做的是能够在应用程序的后期阶段为公司召集所有人员。我确实考虑过使用谓词和外键并抛弃关系来做到这一点,但那是我让自己误以为这是一个数据库,但事实并非如此。

4

1 回答 1

1

您想在核心数据编辑器中设置实体(当您在项目导航器中选择 xcdatamodel 时出现)。

为 Person 和 Company 实体添加名称、电话号码等属性。

然后对于公司实体,在关系下,添加名称为 people 的关系,destination Person。选择该关系后,在数据模型检查器窗格中,勾选表示多对关系的框。对于 Person 实体,添加一个名为 company 的关系,将其目标设置为 Company,并将其反向设置为 people。

从项目导航器中删除您的 NSManagedObjectModel 子类。创建一个新文件并从左侧菜单中选择 Core Data。选择托管对象子类。它将询问您要为其生成实体的数据模型。选择您的数据模型和要为其生成 NSManagedObject 子类的实体(个人和公司)。

然后,您可以查看 Xcode 为您创建的头文件和实现文件,您将看到您为实体设置的属性已在头文件中声明为属性,并且在实现中它们都被标记为动态。更重要的是,对于 Company 和 Person 之间的一对多关系也是如此。您将在 Company.h 中看到 Company 有一个 @property people,它是一个 NSSet。这在您的实现中也被标记为@dynamic。@dynamic 不会像 @synthesize 那样为您创建 getter 和 setter,但您仍然可以为它们使用点表示法。

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

于 2012-10-25T20:26:03.153 回答