2011-04-12 113 views
1

我有用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). 

回答

1

我需要在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]; 
1

你不能改變一個管理對象模型,一旦被使用創建一個對象圖,即在有上下文或使用它的商店之後。該模型定義了圖中所有對象的屬性和關係。如果你在飛行中改變它,圖形變成亂碼。

這也適用於提取的屬性。從NSFetchProperyDescription文檔:

擷取的屬性描述是 編輯,直到它們被一個 對象圖形管理器使用。這允許您 動態創建或修改它們。 但是,一旦使用描述 (當它所屬的管理對象模型爲 與持久性存儲區協調器關聯時),它必須不是(實際上不能)更改。在運行時強制執行此 :在模型與 持久性存儲區協調程序關聯後, 將模型或其任何主題 發生任何嘗試都會導致引發 異常。如果您需要 修改正在使用的模型,請創建 副本,修改副本,然後使用 模型廢棄對象。

+0

是的,但我還沒有創建與NSManagedObjectModel一個NSPersistentStoreCoordinator呢。我會更新我的問題。 – 2011-04-14 02:37:23