コアデータに関する問題があります。 複数のタブを持つアプリがあります。すべてのタブには、さまざまな「オブジェクト」のリストが保持されています。 各タブには、「オブジェクト」を追加できる画面に移動する追加ボタン(+)があります。コアデータ複数のエンティティ
問題:
I挿入のためのエンティティの追加]をクリックします作成し、コンテキストに追加されています。
最初のタブに移動し、[追加]をクリックします。エンティティはコンテキスト内にあります。 私は他のタブに行きます、私は追加をクリックします - 別のエンティティは文脈にあります。
いずれかの情報を追加してから(有効)、保存を終了します。 コアデータは、他のエンティティが有効でないためにコンテキストを保存できないという例外をスローします。私の心に入って来た
ひとつのアイデアは:
コピー文脈から無効であるすべてのオブジェクトは、(必要なときになど)のバックコピーしたものを追加し、コンテキストを保存します。
エンティティは他のエンティティと他の関係を持つことができるため、Personは住所、役割、連絡先の詳細を持つことができます。会社はAddress、Employes ..などを持つことができます。 人が無効で、人を救うことはできませんが、アドレスが保存されるので、正しくはありません。
一時的なコンテキストで何かが動作する可能性がありますが、これを実装する方法が明確ではありません。
もう1つのアイデアは、エンティティ(Personなど)のすべての関係を保存したいときに、Personだけを保存することです。 しかし、再帰関数を実装することができませんでした。問題は、関係が逆であり、私のcoredataモデルの多くの関係のために(人は連絡先の詳細と会社も持っています))。ここで
コードです:あなたが任意のアイデアを持っている場合は
- (void)relationshipInstancesForManagedObject:(NSManagedObject *)managedObject andSkipValue:(id)skipValue andSet:(NSMutableSet *)set { for (NSRelationshipDescription *relationship in managedObject.entity.properties) { if (![relationship isKindOfClass:[NSRelationshipDescription class]]) continue; id value = [managedObject valueForKey:relationship.name]; if (value == skipValue || value == nil || value == self || [set containsObject:value]) continue; NSLog(@"%@",value); if (relationship.isToMany) { if ([value containsObject:skipValue] || [value containsObject:managedObject] || [value count] == 0) { continue; } for (NSManagedObject *entity in value) { [set addObject:entity]; [self relationshipInstancesForManagedObject:entity andSkipValue:skipValue andSet:set]; } } else { if (value != nil) { [set addObject:value]; [self relationshipInstancesForManagedObject:value andSkipValue:skipValue andSet:set]; } } } }
、私は感謝されます。
エンティティとオブジェクトを混同しないようにしてください。クラスのように、エンティティは特定のタイプの管理オブジェクトを記述します。与えられたエンティティのすべてのオブジェクトは同じプロパティセットを持ちます。 – Caleb