setPropertiesToFetch, похоже, не имеет никакого эффекта - PullRequest
6 голосов
/ 07 декабря 2009

Я пытаюсь использовать setPropertiesToFetch в своем запросе на выборку, чтобы ограничить данные, извлекаемые из моего хранилища, но, похоже, это не дает никакого эффекта. Когда я использую его и отображаю объект, возвращенный в консоль, я вижу все свои свойства. Те же данные отображаются независимо от того, установил я свойства или нет. Все отношения отображаются как ошибки, но все данные для атрибутов есть.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
NSDictionary *entityProperties = [entity propertiesByName];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
[fetchRequest setIncludesPendingChanges:NO];
[fetchRequest setReturnsObjectsAsFaults:NO];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"myAttrib"], nil]];

Похоже, что выборка возвращает те же данные для каждого объекта с последней строкой или без нее. Есть идеи?

Ответы [ 4 ]

8 голосов
/ 10 февраля 2011

Специальный раздел документации для setPropertiesToFetch: говорит

Это значение используется, только если для resultType задано значение NSDictionaryResultType.

Ваш фрагмент кода не устанавливает тип результата. Возможно, вы хотели использовать setRelationshipKeyPathsForPrefetching:?

2 голосов
/ 07 декабря 2009

У меня сложилось впечатление (из того, что сказали инженеры Apple), что данные будут сброшены для непрочитанных свойств, как только вы используете методы доступа для этого свойства. Может случиться так, что при создании описания NSManagedObject эти средства доступа используются для каждого свойства, в результате чего данные подвергаются сбоям непосредственно перед созданием строки, описывающей объекты.

Вы можете попробовать использовать инструменты Core Data Faults и / или Core Data Cache Misses (в симуляторе), чтобы увидеть, когда ошибки действительно происходят. Если они произойдут прямо перед тем, как вы распечатаете управляемые объекты, это, похоже, подтвердит мое предположение выше.

0 голосов
/ 08 ноября 2013

Правильный способ использования setPropertiesToFetch

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setResultType:NSDictionaryResultType]; // Remember to setResultType
[fetchRequest setPropertiesToFetch:
[NSArray arrayWithObjects:@"name", @"age", nil]]; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
                                                               error:nil];

NSArray *nameArray = [results valueForKey:@"name"];
NSArray *ageArray = [results valueForKey:@"age"];

результаты - это не массив объектов Person * , а массив Dictionary . Вы можете получить доступ к словарям внутри, как это

NSLog(@"%@", [results[0] valueForKey:@"name"]);
NSLog(@"%@", [results[0] valueForKey:@"age"]);

Если вы хотите работать только с объектом Model (который CoreData извлекает все свойства / атрибуты объекта), вы можете создать свою модель с Person и PersonDetail (который содержит подробную информацию о человеке). Сюда

  • Вы можете выполнить fetchRequest и получить массив объектов Person
  • При доступе к aPerson.detail (подробности - это отношение один-к-одному с PersonDetail), CoreData выполнит ошибку для вас
0 голосов
/ 10 мая 2013

try setReturnsDistinctResults: ДА

из документов Apple:

setReturnsDistinctResults:

Устанавливает, должен ли запрос возвращать только различные значения для полей, указанных в propertiesToFetch.

  • (пустоты) setReturnsDistinctResults: (BOOL) значения

Параметры ценности Если ДА, запрос возвращает только различные значения для полей, указанных в propertiesToFetch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...