我是 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
实体具有属性 firstName
和 lastName
,以及与 CDAddress 的一对一关系
标题为地址
。同样假设您的 CDAddress
实体具有属性 street
、town
和 zipCode
,以及与 的反向关系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/