ios - 如何从核心数据 objective-c 中的两个表中获取数据

标签 ios objective-c core-data

我是 Core Data 的新手。我有两个实体 CDContact 和 CDAddress。我在获取第二个实体 (CDAddress) 时遇到问题。

self.fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"CDContact"];
[self.fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:[CoreDataManager sharedInstance].managedObjectContext sectionNameKeyPath:nil cacheName:nil];

[self.fetchedResultsController setDelegate:self];
[self fetchResults];

它有效,但我只从 CDContact 获取数据。

我尝试了这样的事情(我在文档中找到了这个):

NSManagedObjectContext *context = [CoreDataManager sharedInstance].managedObjectContext;
NSEntityDescription *contactEntity = [NSEntityDescription entityForName:@"CDContact" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = contactEntity;
request.relationshipKeyPathsForPrefetching = [NSArray arrayWithObject:@"CDAddress"];

但在这个版本中,两个实体都不起作用。

如果有任何示例可以帮助我解决此问题,我将很高兴。

最佳答案

根据评论,提取只会返回来自单个实体的结果。要访问第二个实体,您需要运行第二次提取,或者使用 CDContact 对象上的关系。例如,如果关系名为 address

myCDContact.address

将为指定的CDContact提供CDAddress

为了对此进行扩展,假设您的 CDContact 实体具有属性 firstNamelastName,以及与 CDAddress 的一对一关系 标题为地址。同样假设您的 CDAddress 实体具有属性 streettownzipCode,以及与 的反向关系CDContact 标题为联系人

然后,要创建一个名为“John Smith”、居住在“1 Main Street, AnyTown, 90210”的新联系人,您将拥有如下代码:

CDContact *myCDContact = (CDContact *)[NSEntityDescription insertNewObjectForEntityForName:@"CDContact" inManagedObjectContext:context];
myCDContact.firstName = @"John";
myCDContact.lastName = @"Smith";
CDAddress *myCDAddress = (CDAddress *)[NSEntityDescription insertNewObjectForEntityForName:@"CDAddress" inManagedObjectContext:context];
myCDAddress.street = @"1 Main Street";
myCDAddress.town = @"AnyTown";
myCDAddress.zipCode = @"90210";
// and lastly, to set the relationship between them...
// EITHER
myCDContact.address = myCDAddress;
// OR
myCDAddress.contact = myCDContact;

(注意非此即彼:您只需将关系设置为“单向”,CoreData 将自动设置逆关系)。如果您随后保存上下文,然后获取联系人,如下所示:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"CDContact"];
[fetch setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]]];
NSError *error;
NSArray *results = [context executeFetchRequest:fetch error:&error];

然后(假设获取成功:您应该测试 nil/error)该数组将包含您的联系人。获取数组中的第一项,然后您可以访问其属性包括相关的 CDAddress,如下所示:

CDContact *myContact = (CDContact *)[results objectAtIndex:0];
NSLog(@"The contact is %@ %@", myContact.firstName, myContact.lastName);
NSLog(@"who lives at %@, %@, %@", myContact.address.street, myContact.address.town, myContact.address.zipCode);

(以上所有内容都假设您已经为实体创建了 NSManagedObject 子类。如果还没有,您应该这样做。)

关于ios - 如何从核心数据 objective-c 中的两个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445093/

相关文章:

iOS:具有多个动态部分 objective-c 的 uitableview

objective-c - 如何从 OS X 中的设备 ID 知道设备的名称?

objective-c - cocoa 。有没有办法完全禁用所有窗口的自动布局/约束?

ios - NSManagedObjectContext 保存似乎丢失对象

ios - 带有内容插入的 ScrollView 的语音辅助功能分页问题

IOS Custom Segmented Pager - 使指示器滚动而不是标签

ios - 应该在插件中的什么位置添加 iOS 依赖项?

iphone - 访问核心数据实体的 NSString 属性

ios - 是否可以向核心数据添加新属性,而不会出现用户及其当前数据的问题?

ios - 将电话号码复制/粘贴到键盘或以编程方式在 iOS 中调用免费电话号码