У меня есть NSFetchRequest
, который возвращает свойства объектов в NSDictionaryResultType
. Можно ли также получить объект ObjectId в этом словаре? В противном случае мне нужно будет запустить запрос с типом возврата NSManagedObjectResultType
, который намного медленнее для большого количества возвращенных элементов.
Основные данные, как получить NSManagedObject ObjectId, когда NSFetchRequest возвращает NSDictionaryResultType?
Ответ 1
Да, вы можете использовать очень отличный, но плохо документированный класс 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"
в словарях, которые вы возвращаете из запроса на выборку.
Ответ 2
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"? Чистый, простой нужен только один запрос на выборку, чтобы вы могли вытащить все остальные данные, которые вам нужны.
Ответ 3
Единственное решение, которое я нашел до сих пор, заключается в выполнении второго запроса на выборку, который аналогичен запросу начальной выборки, за исключением следующих отличий:
[fetchRequest setReturnsObjectsAsFaults:YES];
[fetchRequest setPropertiesToFetch:nil];
[fetchRequest setFetchLimit:1];
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed
[request setResultType:NSManagedObjectIDResultType];
Это приведет к тому, что запрос на выборку возвращает массив с точно одним объектом, требуемым идентификатором объекта. Производительность кажется хорошей, даже когда исходный запрос запроса выборки содержит 10000 объектов.
Если есть какие-то лучшие способы справиться с этим, я был бы рад, если бы кто-то мог опубликовать их здесь.
Ответ 4
Ник Хатчинсон отвечает в Свифте:
let idDescription = NSExpressionDescription()
idDescription.name = "objectID"
idDescription.expression = NSExpression.expressionForEvaluatedObject()
idDescription.expressionResultType = .objectIDAttributeType
Я не могу прокомментировать это, потому что мне не хватает rep:(