Swift 主实体与次实体关于核心数据保存对象

Swift 主实体与次实体关于核心数据保存对象,swift,core-data,Swift,Core Data,我正在开发一个核心数据应用程序,目前我已经正确设置了保存主对象的方法保存了用户组的名称,但它没有保存次对象,即使保存二者的方法相同。不过,主文件确实保存了第二个文件,我想知道它是否影响了对象的保存顺序。我知道它是一个关系型的,但我想如果在主进程之前调用次进程来保存,这并不重要。我对核心数据还是新手,所以只要一个简单的答案就足够了。如果我需要先保存主实体对象,那么我将以这样的方式构建应用程序,否则我可能必须重新查看代码,以找出为什么它没有被调用 这是在以关系方式保存名称之前应该保存的代码: @IB

我正在开发一个核心数据应用程序,目前我已经正确设置了保存主对象的方法保存了用户组的名称,但它没有保存次对象,即使保存二者的方法相同。不过,主文件确实保存了第二个文件,我想知道它是否影响了对象的保存顺序。我知道它是一个关系型的,但我想如果在主进程之前调用次进程来保存,这并不重要。我对核心数据还是新手,所以只要一个简单的答案就足够了。如果我需要先保存主实体对象,那么我将以这样的方式构建应用程序,否则我可能必须重新查看代码,以找出为什么它没有被调用

这是在以关系方式保存名称之前应该保存的代码:

@IBAction func buttonWarrior(sender: AnyObject) {

    let entity =  NSEntityDescription.entityForName("ClassSelection", inManagedObjectContext: classMOC!)

    let newObject = ClassSelection(entity: entity!,insertIntoManagedObjectContext: classMOC)

    newObject.classname = "Warrior"

    var error: NSError?

    classMOC?.save(&error)

    if let err = error {

        println(err)

    } else {

    self.performSegueWithIdentifier("popOver", sender: self)

    }
}
这是用于存储主对象的代码,主对象是与另一个不同的viewcontroller.swift文件。这显示为次对象上的弹出框。此部件工作正常,可正确召回:

@IBAction func enterButton(sender: AnyObject) {

    let entityDescription = NSEntityDescription.entityForName("Deck",inManagedObjectContext: managedObjectContext!)

    let storeDeck = Deck(entity: entityDescription!,insertIntoManagedObjectContext: managedObjectContext)

    storeDeck.deckname = usersDeckName.text

    var error: NSError?

    managedObjectContext?.save(&error)

    if let err = error {

        status.text = err.localizedFailureReason


    } else {

        usersDeckName.text = ""
        status.text = "Deck Saved"
        self.performSegueWithIdentifier("showCardSelection", sender: self)

    }

}
我尝试使用的召回方法在当前的迭代中可能没有意义,因为我已经尝试了许多不同的方法:

@IBOutlet weak var decksListed: UITableView!

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

var savedDecksClass = [ClassSelection]()

var frc: NSFetchedResultsController = NSFetchedResultsController()

var frcClasses: NSFetchedResultsController = NSFetchedResultsController()

func getFetchedResultsController() -> NSFetchedResultsController {
    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)

return frc

}

func getClassesFetchedResultsController() -> NSFetchedResultsController {

    frcClasses = NSFetchedResultsController(fetchRequest: classFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)

return frcClasses

}

func listFetchRequest() -> NSFetchRequest {

    let fetchRequest = NSFetchRequest(entityName: "Deck")
    let sortDescriptor = NSSortDescriptor(key: "deckname", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    return fetchRequest

}
func classFetchRequest() -> NSFetchRequest {

    let fetchRequestClasses = NSFetchRequest(entityName: "Deck")
    let classSortDescriptor = NSSortDescriptor(key: "classname", ascending: true)
    fetchRequestClasses.sortDescriptors = [classSortDescriptor]

    return fetchRequestClasses
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    let numberofRowsInSection = frc.sections?[section].numberOfObjects

    return numberofRowsInSection!

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("usersDeck", forIndexPath: indexPath) as! UITableViewCell

    let listed = frc.objectAtIndexPath(indexPath) as! Deck
    cell.textLabel?.text = listed.deckname
    let listedClass = frcClasses.objectAtIndexPath(indexPath) as! ClassSelection
    cell.detailTextLabel!.text = listedClass.classname
    return cell

}

func controllerDidChangeContent(controller: NSFetchedResultsController) {

    decksListed.reloadData()

}


override func viewDidLoad() {
    super.viewDidLoad()

    frcClasses = getClassesFetchedResultsController()
    frcClasses.delegate = self
    frc.performFetch(nil)
    frc = getFetchedResultsController()
    frc.delegate = self
    frc.performFetch(nil)

}

我希望这足以给你一个想法。我检查了这些关系,它们在模型中似乎都是正确的。对于一些代码的外观,我深表歉意。我计划在所有编辑工作完成后将其缩小。

感谢pbasdf在这方面的帮助。他打开的聊天实际上包含了需要做的事情。我只是没有保存关系并将对象从一个视图控制器传递到下一个视图控制器。在用一个例子向我展示了如何做到这一点之后,我想出了其余的方法!基本上,它永远无法回忆起这个物体,因为它从来不知道它们是相关的……我真傻!再次感谢

感谢pbasdf帮助我完成这项任务。他打开的聊天实际上包含了需要做的事情。我只是没有保存关系并将对象从一个视图控制器传递到下一个视图控制器。在用一个例子向我展示了如何做到这一点之后,我想出了其余的方法!基本上,它永远无法回忆起这个物体,因为它从来不知道它们是相关的……我真傻!再次感谢

NSManagedObjectContext
save
方法保存上下文中的所有更改。因此,它们的创建顺序是不相关的。编辑你的帖子以包含代码-还有一些其他问题正在发生。我修改了帖子,如“我希望这能让你了解我做了什么,以及我可能做错了什么”。我也不确定这对一个简单的核心数据模型是否重要,但我只是使用App Delegate作为持久的存储协调器,因为我还没有足够的勇气在这之外进行实验,我自己也在自学。我认为对于一个只存储基本统计信息的简单应用程序来说,这没什么大不了的。很抱歉,我意识到我在获取请求中忘了提到一件事,那就是用“classname”调用Deck。我尝试使用实际的类,它是ClassSelection而不是Deck,但仍然有相同的错误弹出窗口,即线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)感谢您发布代码。很难看到错误的确切来源,尽管我担心您在一个表视图中使用了两个FRC。我认为修复它可能需要几次迭代-您是否愿意使用chat,以避免阻塞注释?我不确定我是否已解锁chat,您需要多少个post+?
NSManagedObjectContext
save
方法保存了上下文中的所有更改。因此,它们的创建顺序是不相关的。编辑您的帖子以包含代码-还有一些其他问题。我像被问到的那样修改了帖子,希望这能让您了解我做了什么,以及我可能做错了什么。我也不确定这对一个简单的核心数据模型是否重要,但我只是使用App Delegate作为持久性存储协调器,因为我还没有足够的勇气在这之外进行实验,我自己也在自学。我不认为这对一个只存储基本统计数据的简单应用程序会有多大影响。很抱歉,我意识到我忘记了一件事在使用“classname”调用Deck的fetch请求中,我尝试使用实际的类,它是ClassSelection而不是Deck,但仍然有相同的错误弹出窗口,即线程1:EXC_BAD_访问(code=1,address=0x0)感谢您发布代码。很难看到错误的确切来源,尽管我担心您在一个表视图中使用了两个FRC。我认为修复它可能需要几次迭代-您是否愿意使用chat,以避免阻塞注释?我不确定我是否已解锁chat,您需要多少个post+?