Swift & Core Data - 将实体添加到现有实体

Posted

技术标签:

【中文标题】Swift & Core Data - 将实体添加到现有实体【英文标题】:Swift & Core Data - Adding an entity to an existing entity 【发布时间】:2015-08-12 14:23:46 【问题描述】:

我知道关于核心数据和关系的问题经常发生,但我保证这个问题不一样 :)

我有两个表,一个“Job”表和一个“Scheme”表。

应用加载时会填充方案表,到目前为止一切正常。

我知道,当我创建一个新的“作业”时,我需要获取正确的“方案”,然后将该方案附加到作业。

我的问题是,当 Fetch 发生时我已经在一个临时上下文中,它只会导致 nil 展开错误并摔倒,我认为这与我在操作已经执行时尝试执行 fetchRequest 有关等待我的 managedObjectContext...

这里有一些代码应该概述我所在的位置:

for (index, object) in obj 

                    let entityName = "Job"
                    var request = NSFetchRequest(entityName: entityName)
                    request.predicate = NSPredicate(format: "id = %@", object["id"].string!)

                    var error: NSError?
                    if let results = tempContext.executeFetchRequest(
                        request,
                        error: &error
                        ) as? [NSManagedObject] 
                            if results.count != 0

                                if let moc = self.managedObjectContext 
                                    moc.performBlockAndWait(

                                        for result in results 

                                            self.refreshDataSet(result, object: object)
                                             moc.save(nil)
                                        

                                    )

                                


                            else
                                if let moc = self.managedObjectContext 
                                    moc.performBlockAndWait(

                                        self.createJobData(object, moc: moc)
                                         moc.save(nil)
                                    )                                  
                                
                          
                    

                

所以,self.createJobData(object, moc: moc) 位内部是这样的:

 func createJobData(object: JSON, moc: NSManagedObjectContext)

    let work = NSEntityDescription.insertNewObjectForEntityForName("Work", inManagedObjectContext: moc) as! Work

    let schemeEntity = "Scheme"
    var request = NSFetchRequest(entityName: schemeEntity)
    request.predicate = NSPredicate(format: "id = %@", object["schemeId"].string!)


    self.managedObjectContext!.performBlock  () -> Void in
        var error: NSError?
        if let results = self.managedObjectContext!.executeFetchRequest(
            request,
            error: &error
            ) as? [Scheme] 
                if results.count != 0
                    for result in results
                        println(result)
                    

                

        

    

//....

这就是我感到困惑的地方,我尝试添加另一个 performBlock 但后来意识到这显然不是答案...

任何帮助将不胜感激:)

【问题讨论】:

您是否尝试过不使用块进行重构,只使用主线程托管对象上下文? 【参考方案1】:

我建议在主线程上下文中做所有事情。如果您不能这样做,请在相同背景上下文中执行所有操作。

如果您使用的是获取的结果控制器,它将为您进行查找。大概您的用户选择了Scheme,所以

let scheme = fetchedResultsController.objectAtIndexPath(indexPath) as! Scheme

使用相同的托管对象上下文:

let context = scheme.managedObjectContext // or get it from your Core Data stack
let newJob = NSEntityDescription.insertNewObjectForEntityForName(
                 "Job", inManagedObjectContext: context) as! Job 
newJob.scheme = scheme
do  try context.save()  catch  /*handle error */ 

【讨论】:

以上是关于Swift & Core Data - 将实体添加到现有实体的主要内容,如果未能解决你的问题,请参考以下文章

将 Core Data 相关代码迁移到 Swift 2

如何将日期类型保存到 Swift Core Data 中实体的属性?

我需要帮助将 Core Data 的结果放入 Swift 3 中的数组中

将 NSManagedObject 子类化 Core Data 对象打印到控制台在 Swift 中返回空行

如何将字符串保存到Core Data Swift

Swift 3 Core Data - 如何同步保存上下文?