1

私のアプリケーションには、Core Data Model を生成してNSEntityDescriptions のセットを入力するコードが少しあります。これらのエンティティ記述のそれぞれに、任意の数NSPropertyDescriptionの が割り当てられます。これらのプロパティは と の組み合わせNSAttributeDescriptionですNSRelationshipDescription。すべての関係は既存の関係と照合され、 を使用して相互に逆に設定されsetInverseRelationship:ます。

属性プロパティは正常に機能し、対多関係も正常に機能します。私はそれを徹底的にテストしました。この問題NSRelationshipDescriptionは、値が 1 の s にあるようです。これは、プロパティの説明が の値をmaxCount返すことを意味します。プロパティがこれらのタイプのリレーションシップに設定されている場合、そのリレーションシップを使用するオブジェクトを保存しようとすると Core Data がクラッシュし、次のエラーが表示されます。isToManyNOinverseRelationship

2013-11-09 11:17:15.068 Directory[1344:5c03] -[NSManagedObject count]: unrecognized selector sent to instance 0x9643820
2013-11-09 11:17:15.074 Directory[1344:5c03] *** Terminating app due to uncaught exception  'NSInvalidArgumentException', reason: '-[NSManagedObject count]: unrecognized selector sent to instance 0x9643820'
*** First throw call stack:
(
    0   CoreFoundation                      0x01f9f5e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01d228b6 objc_exception_throw + 44
    2   CoreFoundation                      0x0203c903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x01f8f90b ___forwarding___ + 1019
    4   CoreFoundation                      0x01f8f4ee _CF_forwarding_prep_0 + 14
    5   CoreData                            0x0083c128 -[NSSQLCore _knownOrderKeyForObject:from:inverseToMany:] + 200
    6   CoreData                            0x00773080 -[NSSQLCore _populateRowForOp:withObject:] + 1120
    7   CoreData                            0x00789157 -[NSSQLCore recordValuesForInsertedObject:] + 71
    8   CoreData                            0x00771e8d -[NSSQLCore recordChangesInContext:] + 685
    9   CoreData                            0x00770c55 -[NSSQLCore saveChanges:] + 565
    10  CoreData                            0x0073d88c -[NSSQLCore executeRequest:withContext:error:] + 412
    11  CoreData                            0x0073d380 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 4704
    12  CoreData                            0x00769ffc -[NSManagedObjectContext save:] + 764
    13  Directory                           0x0002f2bf -[ETDatabaseController save] + 111
    14  Directory                           0x0002ba9c -[ETDataLoader performImportWithData:] + 10284

私がここから集めているほのめかしは、逆の関係が対多の関係であるとは考えていないのに、そうではないということです。私の主張によると、私の関係のそれぞれについて私が知っていることは次のとおりです。

relationDescription.inverseRelationship != nil
[relationDescription.inverseRelationship.inverseRelationship isEqual:relationDescription]

モデルを作成し、サンプル データの小さなセットを入力して、これをテストしました。現在、あらゆる種類の属性、対多関係 (逆数あり/なし)、および対 1 関係 (逆数なし) を持つオブジェクトは一貫して機能します。問題は、逆の関係を持つ対 1 の関係を作ろうとしたときに発生します。

これは少し複雑に思えるので、もっと明確にする必要がある場合はお知らせください。ありがとう!

編集1:

リレーションシップの作成は 2 つのステップで行われます。最初にすべてのリレーションシップが作成され、次にルックアップを使用して各リレーションシップの逆が確立されます。

NSRelationshipDescription *description = [[NSRelationshipDescription alloc] init];
[description setName:self.name];
[description setDestinationEntity:entity];
[description setMaxCount:(isToMany ?  0 : 1)];
[description setMinCount:0];
[description setOrdered:YES]; // See you in a minute

後で...

NSEntityDescription *inverseEntity = newRelationship.destinationEntity;
NSRelationshipDescription *inverseRelationDescription = [inverseEntity relationshipsByName][inverse.name];

if (inverseRelationDescription) {
    inverseRelationDescription.inverseRelationship = newRelationship;
    newRelationship.inverseRelationship = inverseRelationDescription;
} else if ([inverse.name isEqualToString:relation.name]) {
    newRelationship.inverseRelationship = newRelationship;
}
4

1 に答える 1

3

まあ、編集 1 を書くと何かがクリックされたと思います。setOrdered:このように、対 1 関係を意図したを呼び出すNSRelationDescriptionと、Core Data の内部では、対 1 関係との競合にもかかわらず、自動的に対多関係と見なされmaxCountます。

リレーションシップの作成コードを次のように変更して、これを修正しました。

NSRelationshipDescription *description = [[NSRelationshipDescription alloc] init];
[description setName:self.name];
[description setDestinationEntity:entity];
[description setMaxCount:(isToMany ?  0 : 1)];
[description setMinCount:0];
[description setOrdered:YES];

に:

NSRelationshipDescription *description = [[NSRelationshipDescription alloc] init];
[description setName:self.name];
[description setDestinationEntity:entity];
[description setMaxCount:(isToMany ?  0 : 1)];
[description setMinCount:0];

if (isToMany)
    [description setOrdered:YES];
于 2013-11-09T19:02:25.003 に答える