核心数据如何获取层次结构?

时间:2014-11-10 18:34:17

标签: ios objective-c core-data

我有简单的核心数据应用程序。只有一个模型对象,其名称为Data。它具有countname属性。它本身也有两种关系。一个用于subDatas,它是To-Many关系,另一个是parentData,它是To-One关系,倒数第一。

以下是核心数据图:

Object Graph

这是我的问题。我想用它们的关系获取这个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个对象。但我只想要父对象。我该如何获取它们?

谢谢。

1 个答案:

答案 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];