为什么我不能访问我的第三级CoreData数据在swift? [英] why I can't access my 3rd level CoreData data in swift?

查看:120
本文介绍了为什么我不能访问我的第三级CoreData数据在swift?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个模型:





在我的一个ViewController类中,我创建了一个方法3 do while循环(嵌套循环),其中我插入所有的cursos 和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,所以在最后一个循环,我想我访问我的第一个subTema数据curso与第一个tema。



好,一切都像我想要的,但是当我试图访问另一个类中的相同的数据可以访问我的数据在任何地方),我的方法访问数据不能识别我的subTemasNSManagedObjects堆栈链接到我的另外两个堆栈的NSManagedObjects。示例:





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



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



Curso.swift

  import Foundation 
import CoreData

类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]

//保护网站域名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 arctlo 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()


}


} b $ b


解决方案

temas 属性是 NSOrderedSet ,下标 [0] 返回
类型 AnyObject 。所以(如注释中所述)你必须将 AnyObject
转换为实际类型

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


b $ b

请注意,您可以使用 for - in 简化循环:

  for curso in cursos {
// ...
}

并递归枚举所有对象将类似于

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


I have this model:

And In one of my ViewController classes I created a method with 3 do while loops (a nested loop) where I insert all the "cursos", "temas" and "subtemas" to populate all my coreData model.

So, inside that method I put this loop to access a part of my coreData data to see if my nested loop work, I did it like this:

    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" is my NSManaged object array containing all my "cursos", so in that last loop I think I access the "subTema" data of my first "curso" with the first "tema".

Well, everything went like I want, but When I tried to access the same data in another class (my original goal: have access to my data anywhere), my method to access the data don't recognised my "subTemas" stack of NSManagedObjects linked to my other two stacks of NSManagedObjects. Example:

Maybe I need to access my data in another way, through my relationships perhaps? if that so, how can I do it? I really need your help, thanks !

Update: My NSManagedObjects Subclasses generated by 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

  }

SubTema.swift

 import Foundation
 import CoreData

 class SubTema: NSManagedObject {

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

 }

Update 2 (relevant code for MartinR):

Inside the VC where I will make a web service call to fill my coreData data, here I don't have to cast my arrays, I can access my data like cursos[index].temas[0].subtemas[ 1 ].name , why ? :

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


    }


}

解决方案

The temas property is a NSOrderedSet, and the subscript [0] returns the type AnyObject. So (as already said in a comment) you have to cast the AnyObject to the actual type

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)

Note that you can simplify your loop using for - in:

for curso in cursos {
    // ...
}

and recursively enumerating all objects would look like

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

这篇关于为什么我不能访问我的第三级CoreData数据在swift?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆