如何以编程方式创建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
前添加NSFetchedPropertyDescription
到NSEntityDescription
。
正确的步骤如下所示:
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文档:
撷取的属性描述是 编辑,直到它们被一个 对象图形管理器使用。这允许您 动态创建或修改它们。 但是,一旦使用描述 (当它所属的管理对象模型为 与持久性存储区协调器关联时),它必须不是(实际上不能)更改。在运行时强制执行此 :在模型与 持久性存储区协调程序关联后, 将模型或其任何主题 发生任何尝试都会导致引发 异常。如果您需要 修改正在使用的模型,请创建 副本,修改副本,然后使用 模型废弃对象。
是的,但我还没有创建与NSManagedObjectModel一个NSPersistentStoreCoordinator呢。我会更新我的问题。 – 2011-04-14 02:37:23