简体   繁体   中英

CoreData + Swift 2: Many-To-Many relation not working for three tables

This is my question.

I'm working with Core Data, Swift 2 on Xcode 7.3.1. I have 3 tables. The first one named TableX, next TableY and finally TableZ, everyone with their attributes. TableX no has any relation, TableY has a relation with TableX which is "To Many" and without reverse; and TableZ has a relation "To Many" with TableY and with reverse. After that I generate my NSManagedObject subclasses.

I added 4 elements in TableX, then I added 1 register in TableY with relation to 4 elements in TableX, and then I added 2 elements in TableZ, each one with relation to the register in TableY. When I do this, the elements in TableX not appears in the first register in TableZ but they appears in the second register, both registers in TableZ save correctly the register in TableY. Why happen this? I added my code.

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

我建议使用魔法记录库。它将基于键值编码工作,因此我们可以使用此库实现多对多关系。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM