核心数据,当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 

我不能评论它,因为我没有足够的代表:(