在我的模型中,我有三个具有以下属性的实体:
HumanTask {idHumanTask,名称,结果,状态,描述}
结果 {idOutcome,label,paramsOutcome}
ParamsOutcome {value,xPath}
正如您所见,HumanTask是一个具有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',原因:'与许多关系无效 ((),名称结果,是可选的 1,isTransient 0,实体HumanTask,renamingIdentifier结果, validation predicates(),warnings(),versionHashModifier(null) userInfo {},目标实体结果,inverseRelationship humanTask,minCount 0,maxCount 0,isOrdered 0,deleteRule 1)通过 to setPropertiesToFetch ::' * 第一次抛出调用堆栈:(0x32b782a3 0x3aa0e97f 0x32918da1 0x32917ce5 0x32980d4f 0x329814d9 0x3ae254b7 0x3ae299f7 0x32971df7 0x329811cb 0x32917f17 0x8048b 0x80379 0x83d21 0x7346d 0x349cb54d 0x349b0313 0x349c77cf 0x34983803 0x3472dd8b 0x3472d929 0x3475c7cf 0x34a2d0e9 0x34a2c2d5 0x34a2b4a7 0x34a2b431 0x34b61309 0x349e9691 0x349e93d5 0x349e8d3b 0x349dfeab 0x349dbaed 0x34a1d1e9 0xa70c7 0x349e0ad9 0x349e0663 0x349d884b 0x34980c39 0x349806cd 0xfdbbb 0x3498011b 0x366745a3 0x366741d3 0x32b4d173 0x32b4d117 0x32b4bf99 0x32abeebd 0x32abed49 0x349d7485 0x349d4301 0x48505 0x48488) libc ++ abi.dylib:terminate调用抛出异常
**
答案 0 :(得分:2)
来自setPropertiesToFetch:
的文档:
属性描述可能表示属性,到一个关系或表达式。
您的“结果”属性是多对多关系,因此无法在此处使用。
如果您需要相关的结果对象,则必须执行“简单”获取请求
(没有NSDictionaryResultType
或setPropertiesToFetch
)。返回一个数组
HumanTask 对象,您可以从中获取相关的结果对象。
答案 1 :(得分:0)
在核心数据管理对象模型中,您的实体是否正确设置?
我的意思是,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];