核心数据,当NSFetchRequest返回NSDictionaryResultType时如何获取NSManagedObject的ObjectId?

时间:2010-10-18 03:16:15

标签: iphone core-data ios nsfetchrequest

我有一个NSFetchRequest,它会在NSDictionaryResultType中返回对象的属性。是否有可能在这个字典中获取对象的ObjectId?否则,我将需要使用返回类型NSManagedObjectResultType运行查询,这对于大量返回的项目要慢得多。

5 个答案:

答案 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