核心数据,当NSFetchRequest返回NSDictionaryResultType时如何获取NSManagedObject的ObjectId?
我有一个NSFetchRequest
返回NSDictionaryResultType
的对象的属性。 是否有可能在这个字典中获得对象的ObjectId? 否则,我将需要使用NSManagedObjectResultType
的返回types来运行查询,这对于大量返回的项目来说要慢得多。
是的,你可以使用非常漂亮,但不好logging的NSExpressionDescription
类。 您需要将正确configuration的NSExpressionDescription
对象添加到您通过setPropertiesToFetch:
为您的NSFetchRequest
设置的NSPropertyDescription
对象的数组中。
例如:
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"
键。
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”呢? 干净,简单只需要一个提取请求,所以你可以拉所有你需要的其他数据。
我目前find的唯一解决scheme是执行第二个获取请求,这与初始获取请求类似,区别如下:
[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个对象。
如果有更好的方法来处理这个,我会很高兴,如果有人可以在这里发表。
Nick Hutchinson在Swift的回答:
let idDescription = NSExpressionDescription() idDescription.name = "objectID" idDescription.expression = NSExpression.expressionForEvaluatedObject() idDescription.expressionResultType = .objectIDAttributeType
我不能评论它,因为我没有足够的代表:(