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

标签 swift core-data relationship

我有这个模型:

enter image description here

在我的一个 ViewController 类中,我创建了一个带有 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”,因此在最后一个循环中,我认为我使用第一个“tema”访问了第一个“curso”的“subTema”数据。

好吧,一切都如我所愿,但是当我尝试访问另一个类中的相同数据时(我最初的目标:在任何地方访问我的数据),我访问数据的方法无法识别我的“subTemas” 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

 }

更新二(MartinR相关代码):

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

  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] 返回 键入 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)
        }
    }
}

关于swift - 为什么我无法快速访问我的第 3 级 CoreData 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27930542/

相关文章:

ios - NSPersistentDocument 和 UIManagedDocument 兼容吗?

c# - 视觉范式中的接口(interface)类关系

swift - 如何在 Swift 中处理与结构体的关系?

swift - 将 Swift uuid_t 传递给 C 函数

swift - 单击时如何切换按钮图像?

swift - FetchedResultsController 值不会覆盖自定义 NSManagedObject 初始值

ios - 属性延迟初始化与核心数据在主线程中运行

ios - 无法在 CoreData 子类中创建新属性? iOS8 Swift3

node.js - Mongoose 前或后保存钩子(Hook)用于更新关系?

json - 嵌套字典 Swift 花括号?