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