我有这个模型:
在我的一个 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 堆栈。示例:
也许我需要以另一种方式访问我的数据,也许是通过我的关系?如果是这样,我该怎么做?我真的需要你的帮助,谢谢!
更新: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/