为什么我无法访问 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)
}
}
}
我有这个型号:
并且在我的 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)
}
}
}