我有简单的核心数据应用程序。只有一个模型对象,其名称为Data
。它具有count
和name
属性。它本身也有两种关系。一个用于subDatas
,它是To-Many关系,另一个是parentData
,它是To-One关系,倒数第一。
以下是核心数据图:
这是我的问题。我想用它们的关系获取这个Data对象。假设如果有2个父Data
对象,并且每个Data
对象都有2个子Data
对象,我想像这个层次结构一样获取它们。以下是我用于在核心数据中创建此层次结构的代码:
Data *parent1 = [self createDataWithName:@"Parent1" andCount:@10 inContext:context];
Data *subData11 = [self createDataWithName:@"Sub1-1" andCount:@11 inContext:context];
Data *subData12 = [self createDataWithName:@"Sub1-2" andCount:@12 inContext:context];
NSMutableOrderedSet *parent1Set = [parent1.subDatas mutableCopy];
[parent1Set addObject:subData11];
[parent1Set addObject:subData12];
parent1.subDatas = [NSOrderedSet orderedSetWithOrderedSet:parent1Set];
Data *parent2 = [self createDataWithName:@"Parent2" andCount:@20 inContext:context];
Data *sub21 = [self createDataWithName:@"Sub2-1" andCount:@21 inContext:context];
Data *sub22 = [self createDataWithName:@"Sub2-2" andCount:@22 inContext:context];
NSMutableOrderedSet *parent2Set = [parent2.subDatas mutableCopy];
[parent2Set addObject:sub21];
[parent2Set addObject:sub22];
parent2.subDatas = [NSOrderedSet orderedSetWithOrderedSet:parent2Set];
NSError *error;
[context save:&error];
if (error) {
NSLog(@"%@", error);
}
// Helper function to create Data object
- (Data *)createDataWithName:(NSString *)name andCount:(NSNumber *)count inContext:(NSManagedObjectContext *)context
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data"
inManagedObjectContext:context];
Data *data = [[Data alloc] initWithEntity:entity
insertIntoManagedObjectContext:context];
data.name = name;
data.count = count;
return data;
}
这是我用来获取的代码:
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Data"];
NSArray *result = [context executeFetchRequest:fetch error:NULL];
result
数组包含所有包含子项的Data
个对象。但我只想要父对象。我该如何获取它们?
谢谢。
答案 0 :(得分:0)
我不认为检查nil会起作用,但您可能会检查子对象的数量是否大于零。以下应该有效:
request = [NSFetchRequest fetchRequestWithEntityName:@"Data"];
request.predicate = [NSPredicate predicateWithFormat:@"subDatas.@count != 0"];
NSError *err = nil;
NSArray *results = [context executeFetchRequest:request error:&err];
另外,请注意,当您重新加载Core Data时,您可能不应该直接设置subDatas。而是使用CoreDataGeneratedAccessors。如果正确设置Core Data,您将在Data.h文件中找到访问器方法。这些方法将负责生成subDatas关系及其反向关系。
所以,删除以下内容:
NSMutableOrderedSet *parent2Set = [parent2.subDatas mutableCopy];
[parent2Set addObject:sub21];
[parent2Set addObject:sub22];
parent2.subDatas = [NSOrderedSet orderedSetWithOrderedSet:parent2Set];
并且(使用CoreDataGeneratedAccessors)将其替换为:
[parent2 addSubDatasObject:sub21];
[parent2 addSubDatasObject:sub22];