如何获取有关系的核心数据对象实例



在我的模型中,我有三个具有以下属性的实体:

HumanTask{idHumanTask,名称,结果,状态,描述}

结果{idOutcome,label,paramsOutcome}

参数输出{value,xPath}

正如您所看到的,HumanTask是一个具有Outcomes类型属性的实体,而Outcomes又具有ParamsOutcome类型属性。我需要的是从其idHumanTask中检索一个HumanTask实例。然后我把我使用的代码:

- (NSDictionary *)findHumanTaskByID:(NSString *)idHumanTask {
    NSArray *requiredFields = [NSArray arrayWithObjects:
                               @"idHumanTask", @"name", @"outcomes", @"status", @"description", nil];
    NSPredicate *queryPredicate = [NSPredicate predicateWithFormat:@"idHumanTask == %@",idHumanTask];
    NSArray *result = [self.entityManager queryEntity: self.entityName
                                            forFields: requiredFields
                                        withPredicate: queryPredicate
                                           andOrderBy: nil
                                            inContext: self.context
                                        andResultType: NSDictionaryResultType];
    return ([result count] > 0 ? [result objectAtIndex:0] : nil);
}

- (NSArray *)queryEntity: (NSString *)entityName
               forFields: (NSArray*)fieldsRequired
           withPredicate: (NSPredicate *)queryPredicate
              andOrderBy: (NSArray*)sortDescriptors
               inContext: (NSManagedObjectContext *)context
           andResultType: (NSFetchRequestResultType)resultType {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
    [request setResultType:resultType];
    [request setReturnsDistinctResults:YES];
    if (queryPredicate) {
        [request setPredicate:queryPredicate];
    } 
    if (fieldsRequired) {
        request.returnsDistinctResults = YES;
        [request setPropertiesToFetch:fieldsRequired];
    } 
    if (sortDescriptors) {
        [request setSortDescriptors:sortDescriptors];
    } 
    __block NSArray *result = nil;
    void (^doSearch)(void) = ^{
        NSError *error = nil;
        result = [context executeFetchRequest:request error:&error];
        if (error != nil) {
            NSLog(@"Error: %@", [error description]);
        }
    };
    if ([NSThread isMainThread]) {
        doSearch();
    } else {
        [context performBlockAndWait:doSearch];
    }
    return result;
}

下面是我在控制台中看到的错误描述:

**

由于未捕获的异常而终止应用"NSInvalidArgumentException",原因:"无效的多对多关系((),name outputs,is可选1,isTransient 0,实体HumanTask,重命名标识符结果,验证谓词()、警告()、版本HashModifier(null)userInfo{},目标实体Result,inverseRelationshiphumanTask、minCount 0、maxCount 0、isOrdered 0、deleteRule 1)要设置要获取的属性::'*首次抛出调用堆栈:(0x32b782a3 0x3aa0e97f 0x32318da1 0x32317ce5 0x32380d4f 0x323814d9 0x3ae254b7 0x3ae299f7 0x32371df70x392811cb 0x39217f17 0x8048b 0x80379 0x83d21 0x7346d 0x349cb54d0x349b0313 0x349c77cf 0x304983803 0x3472d8b 0x3472d929 0x3475c7cf0x34a2d0e9 0x34a2c2d5 0x34a2b4a7 0x34a2b331 0x34b61309 0x349e96910x349e93d5 0x349e8d3b 0x349dfeab 0x349dbaed 0x34a1d1e9 0xa70c70x349e0d9 0x349e0663 0x349d884b 0x34980c39 0x349806cd 0xfdbbb0x30498011b 0x366745a3 0x366741d3 0x362b4d173 0x32b4d117 0x32b4bf990x32beebd 0x32bed49 0x49d7485 0x49d4301 0x48505 0x48488)libc++abi.dylib:调用terminate抛出异常

**

来自setPropertiesToFetch::的文档

属性描述可以表示属性、对一关系或表达式。

您的"outputs"属性是对多的关系,因此不能在此处使用。

如果您需要相关的Outcome对象,则必须执行"简单"的获取请求(没有NSDictionaryResultTypesetPropertiesToFetch)。返回的数组HumanTask对象,您可以从中获取相关的结果

在您的核心数据管理对象模型中,您的实体是否正确设置?

我的意思是,HumanTask是否与Outcomes和Outcomes有一对多关系?与ParamsOutcome有一对很多关系,并且NSManagedObject配置正确(配置它们的最佳方法是删除实体的所有NSManagedObject类,选择核心数据模型中的实体,并在模型中选择实体的情况下按Cmd+N-xcode将自动为您创建类)?

首先尝试检索一批简单的对象。你可以使用这个函数(我总是创建一个处理核心数据操作的单例:

+ (NSArray*) fetchEntity: (NSString*) entityName withPredicate: (NSPredicate*) predicate andSortDescriptors: (NSArray*) sortDescriptors inContext:(NSManagedObjectContext *)context
{
    NSEntityDescription* entity = [NSEntityDescription entityForName: entityName inManagedObjectContext:context];
    NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
    [request setIncludesPropertyValues:NO];
    [request setEntity: entity];
    if (predicate)
        [request setPredicate: predicate];
    if (sortDescriptors)
        [request setSortDescriptors: sortDescriptors];
    NSArray *resultArray = nil;
    NSError *error;
    resultArray = [context executeFetchRequest: request error:&error];
    if (resultArray == nil)
        resultArray = [NSArray array];
    return resultArray;
}
    NSArray * humanTasks = [CoreData fetchEntity:NSStringFromClass([HumanTask class]) withPredicate:nil andSortDescriptors:nil inContext:yourManagedObjectContext];

最新更新