2011-12-15 4 views
0

コアデータに関する問題があります。 複数のタブを持つアプリがあります。すべてのタブには、さまざまな「オブジェクト」のリストが保持されています。 各タブには、「オブジェクト」を追加できる画面に移動する追加ボタン(+)があります。コアデータ複数のエンティティ

問題:

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]; 
       } 
      }  
     } 
    } 

、私は感謝されます。

+0

エンティティとオブジェクトを混同しないようにしてください。クラスのように、エンティティは特定のタイプの管理オブジェクトを記述します。与えられたエンティティのすべてのオブジェクトは同じプロパティセットを持ちます。 – Caleb

答えて

1

問題を解決する最も簡単な方法は、すべてのオブジェクトをストアに追加するときにすべてのオブジェクトが有効であることを確認することです。最初に有効なオブジェクトを作成するために必要な情報を収集し、必要なすべての情報とともに新しいオブジェクトを追加します。

また、現在行っているすべてのプロパティを必要とする必要があるかどうかを慎重に検討してください。それぞれが互いに関係している2つのエンティティを持っている場合は、両方の関係を要求する必要がありますか?関係の1つを任意にすることができますか?これは、どちらのタイプのものもまだ存在しないため、どちらのエンティティにもオブジェクトを追加することが不可能な、鶏と卵の問題を回避するのに役立ちます。

+0

ありがとうございます。それが私の最終的な解決策でした。保存時にデータが有効であることを確認する。タブを変更すると、私はメッセージを掲示し、データを保存せずにユーザーオプションに基づいてデータを削除/保存すると、情報が失われることをユーザーに知らせます。 – victorash

+0

@victorashそれがあなたの最終的な解決策だったら、あなたはCalebの答えを受け入れるべきです。 – drewish

関連する問題