从CoreData获取关系实体的特定数据

时间:2014-11-15 07:46:30

标签: ios iphone core-data one-to-many nsmanagedobject

我的CoreData模型中有Country,State和City实体。结构如下:

@interface Country : NSManagedObject
@property (nonatomic, retain) NSString * cId;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *states; // This will contain State object
@end

@interface State : NSManagedObject
@property (nonatomic, retain) NSString * sId;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *cities; // This will contain City object
@property (nonatomic, retain) Country *country;
@end

@interface City : NSManagedObject
@property (nonatomic, retain) NSString * cityId;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) State *state;
@end

正如你所看到的,我在国家与州之间有一对多的关系。

现在我想要的是获取所有州的国家/地区列表,但不希望城市列表与州相关联。

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Country"];
[request setPropertiesToFetch:@[@"cId", @"title", @"states"]]; 
NSError *error = nil;
NSArray *aryCategories = [gblAppDelegate.managedObjectContext executeFetchRequest:request error:&error];

setPropertiesToFetch设置此属性允许只提供实体中提到的字段,但是如何仅为包含State对象的NSSet状态设置sid和title。

要获取城市列表,我会发送另一个请求。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

您不需要propertiesToFetch。此功能(BTW需要NSDictionaryResultType)适用于您拥有大量数据且只需要某些字段的特殊情况。在您的情况下,这绝对没有必要!

只需获取Country个对象。核心数据将自动优化,以避免将不必要的数据提取到内存中。

NSFetchRequest *request = [NSFetchRequest fetchRequestsWithEntityName:@"Country"];
// consider sorting
NSArray *countryList = [context executeFetchRequest:request error:nil];

您现在有一个国家/地区列表。它还包含各州。获得特定国家的州可能不会更简单。

NSSet *states = country.states;

注意:我认为从CityState" country"是有问题的。我建议将其重命名为state