Как я могу создать NSFetchedPropertyDescription программно? - PullRequest
1 голос
/ 12 апреля 2011

У меня есть ранее существовавший NSManagedObjectModel, который я создал с помощью графического интерфейса Xcode.Я хочу создать отсортированное извлеченное свойство, которое графический интерфейс Xcode 3.2 не поддерживает.Я делаю все это до создания моего NSPersistentStoreCoordinator, потому что я знаю, что вы не можете изменить NSManagedObjectModel после того, как менеджер графов объектов начал его использовать.Я создал NSFetchedPropertyDescription таким образом:

NSManagedObjectModel *managedObjectModel = ... // fetch from my mainBundle

NSEntityDescription *fetchedPropertyEntityDescription = [entitiesByName objectForKey:@"MyEntity"];

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:fetchedPropertyEntityDescription];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"myPredicateProperty == $FETCH_SOURCE"]];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"mySortProperty" ascending:YES]]];

NSFetchedPropertyDescription *fetchedPropertyDescription = [[[NSFetchedPropertyDescription alloc] init] autorelease];
[fetchedPropertyDescription setFetchRequest:fetchRequest];
[fetchedPropertyDescription setName:@"myFetchedProperty"];

NSEntityDescription *entityDescription = [entitiesByName objectForKey:@"MyFetchSourceEntity"];

[entityDescription setProperties:[[entityDescription properties] arrayByAddingObject:fetchedPropertyDescription]];

Когда я звоню

[fetchedPropertyDescription setFetchRequest:fetchRequest];

, я получаю следующее исключение:

NSInvalidArgumentException: Can't use fetch request with fetched property description (entity model mismatch).

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Мне нужно было добавить NSFetchedPropertyDescription к NSEntityDescription перед установкой NSFetchRequest на NSFetchedPropertyDescription.

Ниже приведены правильные шаги:

NSManagedObjectModel *managedObjectModel = ... // fetch from my mainBundle

NSEntityDescription *fetchedPropertyEntityDescription = [entitiesByName objectForKey:@"MyEntity"];

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:fetchedPropertyEntityDescription];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"myPredicateProperty == $FETCH_SOURCE"]];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"mySortProperty" ascending:YES]]];

NSFetchedPropertyDescription *fetchedPropertyDescription = [[[NSFetchedPropertyDescription alloc] init] autorelease];
//DON'T DO THIS HERE, AN ERROR WILL OCCUR
//[fetchedPropertyDescription setFetchRequest:fetchRequest];
//
[fetchedPropertyDescription setName:@"myFetchedProperty"];

NSEntityDescription *entityDescription = [entitiesByName objectForKey:@"MyFetchSourceEntity"];

[entityDescription setProperties:[[entityDescription properties] arrayByAddingObject:fetchedPropertyDescription]];

//DO THIS HERE INSTEAD
[fetchedPropertyDescription setFetchRequest:fetchRequest];
1 голос
/ 13 апреля 2011

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

Это относится и к выбранным свойствам. Из документации NSFetchProperyDescription:

Получено описание недвижимости редактируемый, пока они не используются менеджер графов объектов. Это позволяет вам создавать или изменять их динамически. Однако, как только описание используется (когда модель управляемого объекта которому он принадлежит, ассоциируется с постоянный координатор магазина), он должен не (действительно не может) быть изменено. это применяется во время выполнения: любая попытка мутировать модель или любой из ее субъектов после того, как модель связана с постоянный координатор магазина вызывает исключение быть брошенным. Если вам нужно изменить используемую модель, создать копию, измените копию, а затем отказаться от объектов со старым модель.

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