2011-04-12 2 views
1

私はXcode GUIで作成した既存のNSManagedObjectModelを持っています。 Xcode 3.2のGUIがサポートしていないソート済みのプロパティを作成したい。オブジェクトグラフマネージャーを使用してNSManagedObjectModelを変更できないことがわかっているので、私はNSPersistentStoreCoordinatorを作成する前にこれをすべて行います。私はthusly NSFetchedPropertyDescriptionを作成しました:プログラムでNSFe​​tchedPropertyDescriptionを作成するにはどうすればよいですか?

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

私はNSFetchedPropertyDescriptionNSFetchRequestを設定する前NSEntityDescriptionNSFetchedPropertyDescriptionを追加する必要がありました。

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を作成していない:

適切な手順は以下の通りです。私は私の質問を更新します。 –