繁体   English   中英

如何从核心数据Objective-C中的两个表中获取数据

[英]how to fetch data from two tables in core data objective-c

我是新使用的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 ,或使用CDContact对象上的关系。 例如,如果关系被命名为address

myCDContact.address

会给CDAddress指定的CDContact

为了对此进行扩展,假定您的CDContact实体具有属性firstNamelastName ,以及与CDAddress名为address的一对一关系。 同样假设你CDAddress实体具有属性streettownzipCode ,并反向关系CDContact有权contact

然后,要创建一个新的名为“ 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子类。如果尚未创建,则应该这样做。)

pbasdf提供的答案是完美且非常详细的。 但是,我想从apple文档中添加它。

要使用托管对象上下文检索数据,请创建一个提取请求。 提取请求是一个对象,用于指定所需的数据,例如“所有雇员”或“按薪金从高到低排序的营销部门中的所有雇员。”提取请求分为三个部分。 至少必须指定一个实体的名称(通过暗示,您一次只能获取一种类型的实体) 它还可能包含一个谓词对象,该对象指定对象必须匹配的条件;以及一个排序描述符对象数组,该数组指定对象应出现的顺序...

假设实体CDContact和CDAddress之间的关系是一对一的,您的CDContact接口文件应如下所示:

@interface CDContact : NSManagedObject

@property (nonatomic,strong) NSString *firstName;
@property (nonatomic,strong) NSString *lastName;
@property (nonatomic,strong) CDAddress *address;

@end

这样,一旦获取给定的CDContact对象,就可以使用属性“ address”访问相关的CDAddress对象。 但是,如果您需要访问所有地址和所有联系人,则需要执行两次单独的访存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM