Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据如何获取层次结构?_Ios_Objective C_Core Data - Fatal编程技术网

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

Ios 核心数据如何获取层次结构?,ios,objective-c,core-data,Ios,Objective C,Core Data,我有一个简单的核心数据应用程序。只有一个模型对象,其名称为Data。它具有count和name属性。它自身也有两种关系。一个用于子数据,它是对多个关系,另一个是父数据,它是对一个关系和第一个关系的倒数 下面是核心数据图,如下所示: 这是我的问题。我想获取这些数据对象及其关系。假设有两个父数据对象,每个数据对象有两个子数据对象,我想像这个层次结构一样获取它们。以下是我用于在核心数据中创建此层次结构的代码: Data *parent1 = [self createDataWithName:@"Pa

我有一个简单的核心数据应用程序。只有一个模型对象,其名称为
Data
。它具有
count
name
属性。它自身也有两种关系。一个用于
子数据
,它是对多个关系,另一个是
父数据
,它是对一个关系和第一个关系的倒数

下面是核心数据图,如下所示:

这是我的问题。我想获取这些数据对象及其关系。假设有两个父
数据
对象,每个
数据
对象有两个子
数据
对象,我想像这个层次结构一样获取它们。以下是我用于在核心数据中创建此层次结构的代码:

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];
结果
数组包含包含子项的所有
数据
对象。但我只想要父对象。我怎么去拿


谢谢。

我认为检查nil不起作用,但您可以检查子对象的数量是否大于零。以下方面应起作用:

request = [NSFetchRequest fetchRequestWithEntityName:@"Data"];
request.predicate = [NSPredicate predicateWithFormat:@"subDatas.@count != 0"];
NSError *err = nil;
NSArray *results = [context executeFetchRequest:request error:&err];
另外,请注意,在加载核心数据时,可能不应该直接设置子数据。相反,请使用CoreDataGeneratedAccessor。如果正确设置核心数据,您将在Data.h文件中找到访问器方法。这些方法将负责生成子数据关系及其逆关系

因此,删除以下内容:

NSMutableOrderedSet *parent2Set = [parent2.subDatas mutableCopy];
[parent2Set addObject:sub21];
[parent2Set addObject:sub22];

parent2.subDatas = [NSOrderedSet orderedSetWithOrderedSet:parent2Set];
和(使用CoreDataGeneratedAccessor)将其替换为:

[parent2 addSubDatasObject:sub21];
[parent2 addSubDatasObject:sub22];

您的意思是使用像这样的预测:
@“subData!=nil”
。如果将此项添加到获取中,您将只拥有至少包含一个子数据的
数据,或者可能找到没有父数据的数据:
@“parentData==nil”