[英]IOS/Objective-C: NSPredicate and NULL values in core data fetch
[英]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
实体具有属性firstName
和lastName
,以及与CDAddress
名为address
的一对一关系。 同样假设你CDAddress
实体具有属性street
, town
和zipCode
,并反向关系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.