1

NSManagedObjectModelXcode GUI で作成した既存のものがあります。Xcode 3.2 の GUI ではサポートされていない、並べ替えられたフェッチ済みプロパティを作成したいと考えています。オブジェクト グラフ マネージャが使用を開始しNSPersistentStoreCoordinatorた後は変更できないことがわかっているため、作成する前にこれらすべてを行います。NSManagedObjectModel私はこうして作成しました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).
4

2 に答える 2

1

オブジェクト グラフの作成に一度使用された管理対象オブジェクト モデルを変更することはできません。つまり、それを使用するコンテキストまたはストアが作成された後です。モデルは、グラフ内のすべてのオブジェクトのプロパティと関係を定義します。その場で変更すると、グラフは意味不明になります。

これは、フェッチされたプロパティにも適用されます。NSFetchProperyDescription ドキュメントから:

フェッチされたプロパティの説明は、オブジェクト グラフ マネージャによって使用されるまで編集可能です。これにより、それらを動的に作成または変更できます。ただし、記述が使用されると (その記述が属する管理対象オブジェクト モデルが永続ストア コーディネータに関連付けられている場合)、変更してはなりません (実際には変更できません)。これは実行時に強制されます。モデルが永続ストア コーディネーターに関連付けられた後にモデルまたはそのサブジェクトを変更しようとすると、例外がスローされます。使用中のモデルを変更する必要がある場合は、コピーを作成し、コピーを変更してから、古いモデルのオブジェクトを破棄します。

于 2011-04-12T20:11:21.883 に答える
1

に を設定する前にNSFetchedPropertyDescriptionにを追加する必要がありました。NSEntityDescriptionNSFetchRequestNSFetchedPropertyDescription

適切な手順は次のとおりです。

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];
于 2011-04-14T02:47:52.750 に答える