Основные данные, как получить NSIanagedObject's ObjectId, когда NSFetchRequest возвращает NSDictionaryResultType? - PullRequest
34 голосов
/ 18 октября 2010

У меня есть NSFetchRequest, который возвращает свойства объектов в NSDictionaryResultType.Можно ли также получить ObjectId объектов в этом словаре?В противном случае мне нужно будет выполнить запрос с типом возврата NSManagedObjectResultType, который намного медленнее для большого количества возвращаемых элементов.

Ответы [ 4 ]

78 голосов
/ 25 января 2011

Да, вы можете использовать очень изящный, но плохо документированный класс 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" в словарях, которые вы получаете по запросу на выборку.

4 голосов
/ 15 марта 2011
 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"? Чистый, простой, нужен только один запрос на выборку, чтобы вы могли получить все остальные данные, которые вам нужны.

0 голосов
/ 02 января 2016

Ответ Ника Хатчинсона в Swift:

    let idDescription = NSExpressionDescription()
    idDescription.name = "objectID"
    idDescription.expression = NSExpression.expressionForEvaluatedObject()
    idDescription.expressionResultType = .objectIDAttributeType

Я не могу это прокомментировать, потому что мне не хватает представителя :(

0 голосов
/ 23 декабря 2010

Единственное решение, которое я нашел до сих пор, - это выполнение второго запроса на выборку, который похож на первоначальный запрос на выборку, за исключением следующих отличий:

[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 объектов.

Если есть более эффективные способы справиться с этим, я был бы рад, если бы кто-то мог опубликовать их здесь.

...