2011-04-12 3 views
1

У меня есть уже существующий NSManagedObjectModel, который я создал с помощью графического интерфейса Xcode. Я хочу создать отсортированное свойство, которое не поддерживает графический интерфейс Xcode 3.2. Я делаю все это до создания моего NSPersistentStoreCoordinator, потому что я знаю, что вы не можете изменить NSManagedObjectModel после того, как менеджер графа объектов начал его использовать. Я создал NSFetchedPropertyDescription таким образом:Как я могу создать 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). 

ответ

1

мне нужно добавить 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

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

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

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

+0

Да, но я не создал NSPersistentStoreCoordinator с NSManagedObjectModel еще. Я уточню свой вопрос. –

Смежные вопросы