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

时间:2015-01-13 20:02:42

标签: swift core-data relationship

我有这个型号:

enter image description here

在我的一个ViewController类中,我创建了一个带有3个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)

&#34; cursos&#34;是我的NSManaged对象数组,包含我所有的&#34; cursos&#34;,所以在最后一个循环中我想我访问了&#34; subTema&#34;我的第一个&#34; curso&#34;的数据与第一个&#34; tema&#34;。

嗯,一切都按照我想要的方式进行,但当我尝试访问另一个类中的相同数据时(我的原始目标:可以随处访问我的数据),我访问数据的方法不会识别我的& #34; subTemas&#34; NSManagedObjects的堆栈链接到我的另外两个NSManagedObjects堆栈。例如:

enter image description here

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

更新:由Xcode生成的我的NSManagedObjects子类:

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

  }

SubTema.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()


    }


}

1 个答案:

答案 0 :(得分:3)

temas属性为NSOrderedSet,下标[0]返回 输入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)
        }
    }
}