为什么我无法访问 swift 中的第 3 级 CoreData 数据?

why I can't access my 3rd level CoreData data in swift?

我有这个型号:

并且在我的 ViewController classes 之一中,我创建了一个带有 3 个 do while 循环(嵌套循环)的方法,我在其中插入了所有 "cursos"、"temas" 和 "subtemas" 来填充我所有的 coreData 模型。

因此,在该方法中,我将此循环用于访问我的部分 coreData 数据,以查看我的嵌套循环是否有效,我是这样做的:

    var i = cursos.count
    var index = 0


    do{

        println(cursos[index].nombre)
        println(cursos[index].temas[0].nombre)
        println(cursos[index].temas[0].subTemas[0].nombre)

        index++
    }while(index < i)

"cursos" 是我的 NSManaged 对象数组,其中包含我所有的 "cursos",所以在最后一个循环中,我想我访问了我的第一个 "curso" 的 "subTema" 数据首先 "tema".

好吧,一切都如我所愿,但是当我尝试访问另一个 class 中的相同数据时(我最初的目标:在任何地方访问我的数据),我访问数据的方法不它识别出我的 "subTemas" 堆栈 NSManagedObjects 链接到我的另外两个 NSManagedObjects 堆栈。示例:

也许我需要以另一种方式访问​​我的数据,也许是通过我的关系?如果是这样,我该怎么做?我真的需要你的帮助,谢谢!

更新:我的 NSManagedObjects Subclasses 由 Xcode:

生成

Curso.swift

 import Foundation
 import CoreData

 class Curso: NSManagedObject {

 @NSManaged var msjBienvenida: String
 @NSManaged var nombre: String
 @NSManaged var nombrePng: String
 @NSManaged var temas: NSOrderedSet

    }

Tema.swift

  import Foundation
  import CoreData

  class Tema: NSManagedObject {

  @NSManaged var nombre: String
  @NSManaged var curso: Curso
  @NSManaged var subTemas: NSOrderedSet

  }

亚Tema.swift

 import Foundation
 import CoreData

 class SubTema: NSManagedObject {

 @NSManaged var nombre: String
 @NSManaged var tema: Tema

 }

更新2(MartinR的相关代码):

在 VC 中,我将调用 Web 服务来填充我的 coreData 数据,在这里我不必转换我的数组,我可以像 cursos[index].temas[ 一样访问我的数据0].subtemas[ 1 ].name ,为什么? :

  func webServiceCall2(index:Int){


   var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

   var exeWebServiceCall2 = defaults.objectForKey("exeWebServiceCall2") as? Bool

    if (exeWebServiceCall2 == true){

    var temasArray:[String] = ["Word","PowerPoint","Excel"]
    var subTemasArray: [String] = ["Introduccion","Tema 1","Tema 2"," Tema 3"]

    //Guardar temas y subtemas adquiridos de mi web service a mi grafo de objetos de coreData
    var cantidadCursos = cursos.count
    var indexCursos = 0
    var cantidadTemas = temasArray.count
    var indexTemas = 0
    var cantidadSubTemas = subTemasArray.count
    var indexSubTemas = 0


      var error: NSError?

    do{//para cada uno de mis cursos
        var cursoActual = cursos[indexCursos]

        do{//agregar un objeto entity Tema(que contiene un arreglo con los temas)

        let temaEntity = NSEntityDescription.entityForName("Tema", inManagedObjectContext: managedContext)
        let temaActual = Tema(entity: temaEntity!, insertIntoManagedObjectContext: managedContext)
        temaActual.nombre = temasArray[indexTemas]

            //Inserto todos los temas a mi curso Actual
            var temas = cursoActual.temas.mutableCopy() as NSMutableOrderedSet
            temas.addObject(temaActual)
            cursoActual.temas = temas.copy() as NSOrderedSet

                 do{

                let subTemaEntity = NSEntityDescription.entityForName("SubTema", inManagedObjectContext: managedContext)
                let subTemaActual = Tema(entity: subTemaEntity!, insertIntoManagedObjectContext: managedContext)
                subTemaActual.nombre = subTemasArray[indexSubTemas]

                //Inserto todos los subTemas a mi tema Actual
                var subTemas = temaActual.subTemas.mutableCopy() as NSMutableOrderedSet
                subTemas.addObject(subTemaActual)
                temaActual.subTemas = subTemas.copy() as NSOrderedSet

                    //Guardar, aunque no estoy seguro si puedo usar el mismo managedContext que ya tenia
                    if !managedContext.save(&error)
                      {
                            println("No pude guardar: \(error)")
                      }

                       indexSubTemas++
                    }while(indexSubTemas < cantidadSubTemas)

               //reset index subtemas  y aumento indexTemas para el siguiente ciclo de temas
              indexSubTemas = 0
             indexTemas++
           }while(indexTemas < cantidadTemas)
        //reset index temas  y aumento indexCursos para el siguiente ciclo de cursos
        indexTemas = 0
        indexCursos++
    }while(indexCursos < cantidadCursos)


        defaults.setBool(false, forKey: "exeWebServiceCall2")
        defaults.synchronize()


    }


}

temas属性是一个NSOrderedSet,下标[0]returns 输入 AnyObject。所以(正如评论中已经说过的)你必须投下 AnyObject 到实际类型

let curso = cursos[index]
println(curso.nombre)
let firstTema = curso.temas[0] as Tema
println(firstTema.nombre)
let firstSubTema = firstTema.subTemas[0] as SubTema
println(firstSubTema.nombre)

请注意,您可以使用 for - in:

来简化循环
for curso in cursos {
    // ...
}

递归枚举所有对象看起来像

for curso in cursos {
    println(curso.nombre)

    for tema in curso.temas.array as [Tema] {
        println(tema.nombre)

        for subtema in tema.subTemas.array as [SubTema] {
            println(subtema.nombre)
        }
    }
}