2016-06-11 15 views
0

これは私の質問です。CoreData + Swift 2:多対多の関係が3つのテーブルで機能しない

私はXcode 7.3.1でCore Data Swift 2を使用しています。私は3つのテーブルを持っています。最初の名前はTableX、次のTableY、最後はTableZです。 TableXは何の関係も持た​​ず、TableYはTableXとの関係が "To Many"であり逆ではない。 TableZにはTableYと逆の関係の「To Many」があります。その後、NSManagedObjectサブクラスを生成します。

TableXに4つの要素を追加した後、TableXの4つの要素に関連してTableYに1つのレジスタを追加し、TableYに2つの要素を追加しました。これを行うと、TableXの要素はTableZの最初のレジスタには表示されませんが、2番目のレジスタに表示され、TableZの両方のレジスタがTableYのレジスタを正しく保存します。なぜこれが起こる?私は自分のコードを追加しました。

func addElementToTableX(idEleX: String)->TableX?{ 
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

    let fetchRequestTableX = NSFetchRequest(entityName: "TableX") 
    let predicateTableX = NSPredicate(format: "tablexid == %@", idEleX) 
    fetchRequestTableX.predicate = predicateTableX 
    do { 
     let fetchedEntitiesTableX = try managedObjectContext.executeFetchRequest(fetchRequestTableX) as! [TableX] 
     if (fetchedEntitiesTableX.count == 0){ 
      let newTableX = NSEntityDescription.insertNewObjectForEntityForName("TableX", inManagedObjectContext: managedObjectContext) as! TableX 

     newTableX.tablexid = "saldkjadkj" 
     do { 
      try newTableX.managedObjectContext!.save() 
      print("Saved!") 
      return newTableX 
     } catch let error as NSError { 
      print("Error") 
      return nil 
     } 
     }else{ 
      print("This element exist") 
      return fetchedEntitiesTableX[0] 
     } 
    } catch { 
     return nil 
    }    
} 


func addElementToTableY(idEleY: String, elementsTableX: [TableX])->TableY?{ 
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

    let fetchRequestTableY = NSFetchRequest(entityName: "TableY") 
    let predicateTableY = NSPredicate(format: "tableyid == %@", idEleY) 
    fetchRequestTableY.predicate = predicateTableY 
    do { 
     let fetchedEntitiesTableY = try managedObjectContext.executeFetchRequest(fetchRequestTableY) as! [TableY] 
     if (fetchedEntitiesTableY.count == 0){ 
      let newTableY = NSEntityDescription.insertNewObjectForEntityForName("TableY", inManagedObjectContext: managedObjectContext) as! TableY 

     newTableY.tableyid = "ccbnnzmz" 
     newTableY.setValue(NSSet(array: elementsTableX), forKey: "tableX") 
     do { 
      try newTableY.managedObjectContext!.save() 
      print("Saved!") 
      return newTableY 
     } catch let error as NSError { 
      print("Error") 
      return nil 
     } 
     }else{ 
      print("This element exist") 
      return fetchedEntitiesTableY[0] 
     } 
    } catch { 
     return nil 
    }    
} 

func addElementToTableZ(idEleZ: String, elementsTableY: [TableY])->TableZ?{ 
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

    let fetchRequestTableZ = NSFetchRequest(entityName: "TableZ") 
    let predicateTableZ = NSPredicate(format: "tablezid == %@", idEleZ) 
    fetchRequestTableZ.predicate = predicateTableZ 
    do { 
     let fetchedEntitiesTableZ = try managedObjectContext.executeFetchRequest(fetchRequestTableZ) as! [TableZ] 
     if (fetchedEntitiesTableZ.count == 0){ 
      let newTableZ = NSEntityDescription.insertNewObjectForEntityForName("TableZ", inManagedObjectContext: managedObjectContext) as! TableZ 

     newTableZ.tablezid = "ccbnnzmz" 
     newTableZ.setValue(NSSet(array: elementsTableZ), forKey: "tableZ") 
     do { 
      try newTableZ.managedObjectContext!.save() 
      print("Saved!") 
      return newTableZ 
     } catch let error as NSError { 
      print("Error") 
      return nil 
     } 
     }else{ 
      print("This element exist") 
      return fetchedEntitiesTableZ[0] 
     } 
    } catch { 
     return nil 
    }    
} 
+0

非常に正当な理由がない限り、逆の関係を指定しないでください。 「コアデータプログラミングガイド」の「インバースリレーションシップ」(https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/HowManagedObjectsarerelated.html#//apple_ref/doc/uid/TP40001075- CH17-SW1)。私はこれが問題の少なくとも一部であるかもしれないと思う。 – pbasdf

答えて

0

私は魔法の記録ライブラリを提案します。これはキー値コーディングに基づいて動作するので、このライブラリを使用して多くの関係を達成することができます。

関連する問題