为什么我不能访问我的第三级CoreData数据在swift? [英] why I can't access my 3rd level CoreData data in 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 aNSOrderedSet
, and the subscript[0]
returns the typeAnyObject
. So (as already said in a comment) you have to cast theAnyObject
to the actual typelet 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屋!