如何以编程方式创建NSFetchedPropertyDescription?

问题描述:

我有用Xcode GUI创建的预先存在的NSManagedObjectModel。我想创建一个排序的抓取属性,Xcode 3.2的GUI不支持。在创建我的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). 

我需要在NSFetchedPropertyDescription设置NSFetchRequest前添加NSFetchedPropertyDescriptionNSEntityDescription

正确的步骤如下所示:

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]; 

你不能改变一个管理对象模型,一旦被使用创建一个对象图,即在有上下文或使用它的商店之后。该模型定义了图中所有对象的属性和关系。如果你在飞行中改变它,图形变成乱码。

这也适用于提取的属性。从NSFetchProperyDescription文档:

撷取的属性描述是 编辑,直到它们被一个 对象图形管理器使用。这允许您 动态创建或修改它们。 但是,一旦使用描述 (当它所属的管理对象模型为 与持久性存储区协调器关联时),它必须不是(实际上不能)更改。在运行时强制执行此 :在模型与 持久性存储区协调程序关联后, 将模型或其任何主题 发生任何尝试都会导致引发 异常。如果您需要 修改正在使用的模型,请创建 副本,修改副本,然后使用 模型废弃对象。

+0

是的,但我还没有创建与NSManagedObjectModel一个NSPersistentStoreCoordinator呢。我会更新我的问题。 – 2011-04-14 02:37:23