gpt4 book ai didi

ios - 核心数据 : Subclassed NSManagedObject and Relationships

转载 作者:行者123 更新时间:2023-11-29 13:26:08 25 4
gpt4 key购买 nike

我为个人和公司创建了 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

在我的“Add Person” View Controller 中,部分保存方法如下。

    //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 上使用一个方法 - 这个方法看起来如何?

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

最佳答案

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

为个人和公司实体添加名称、电话号码等属性。

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

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

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

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

关于ios - 核心数据 : Subclassed NSManagedObject and Relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com