我有一个NSFetchRequest
,它会在NSDictionaryResultType
中返回对象的属性。是否有可能在这个字典中获取对象的ObjectId?否则,我将需要使用返回类型NSManagedObjectResultType
运行查询,这对于大量返回的项目要慢得多。
答案 0 :(得分:78)
是的,您可以使用非常漂亮但记录严重的NSExpressionDescription
课程。您需要将正确配置的NSExpressionDescription
对象添加到您为NSPropertyDescription
通过setPropertiesToFetch:
设置的NSFetchRequest
个对象数组中。
例如:
NSExpressionDescription* objectIdDesc = [[NSExpressionDescription new] autorelease];
objectIdDesc.name = @"objectID";
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject];
objectIdDesc.expressionResultType = NSObjectIDAttributeType;
myFetchRequest.propertiesToFetch = [NSArray arrayWithObjects:objectIdDesc, anotherPropertyDesc, yetAnotherPropertyDesc, nil];
NSArray* fetchResults = [myContext executeFetchRequest:myFetchRequest error:&fetchError];
然后,您应该从获取请求中获取字典中的@"objectID"
键。
答案 1 :(得分:4)
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"yourEntity" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES], nil];
request.predicate = nil;
request.fetchLimit = 20;
NSError *error = nil;
NSArray fetchedResults = [context executeFetchRequest:request error:&error];
NSLog(@"%@", [fetchedResults valueForKey:@"objectID"]);
由于您获取的结果已经在数组中,为什么不使用valueForKey:@“objectID”将它们拉出来?干净,简单只需要一个获取请求,这样您就可以获取所需的所有其他数据。
答案 2 :(得分:0)
到目前为止我找到的唯一解决方案是执行第二次获取请求,这与初始获取请求类似,但以下区别除外:
[fetchRequest setReturnsObjectsAsFaults:YES];
[fetchRequest setPropertiesToFetch:nil];
[fetchRequest setFetchLimit:1];
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed
[request setResultType:NSManagedObjectIDResultType];
这将导致获取请求返回一个只包含一个对象的数组,即所需的objectID。即使初始获取请求的结果包含10000个对象,性能似乎也很好。
如果有更好的方法可以解决这个问题,我很高兴有人可以在这里发帖。
答案 3 :(得分:0)
尼克哈钦森在斯威夫特的回答:
let idDescription = NSExpressionDescription()
idDescription.name = "objectID"
idDescription.expression = NSExpression.expressionForEvaluatedObject()
idDescription.expressionResultType = .objectIDAttributeType
我无法发表评论,因为我没有足够的代表:(
答案 4 :(得分:0)
已接受答案的快速版本
let objectIDExpression = NSExpressionDescription()
objectIDExpression.name = "objectID"
objectIDExpression.expression = NSExpression.expressionForEvaluatedObject()
objectIDExpression.expressionResultType = .objectIDAttributeType
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: enitiyName)
fetchRequest.resultType = .dictionaryResultType
//
var propertiesToFetch: [Any] = [objectIDExpression]
propertiesToFetch.append(contentsOf: entity.properties)
fetchRequest.propertiesToFetch = propertiesToFetch