Ios Swift&;核心数据-将实体添加到现有实体
我知道关于核心数据和关系的问题经常出现,但我保证这是不同的:) 我有两个表,一个“作业”表和一个“方案”表 应用程序加载时填充scheme表,到目前为止一切正常 我理解,当我创建一个新的“作业”时,我需要获取正确的“方案”,然后将该方案附加到作业 我的问题是,在进行提取时,我已经在临时上下文中,这只会导致零解包裹错误并失败,我认为这与我在managedObjectContext上已挂起操作时尝试执行提取请求有关 下面是一些代码,可以概括我的位置:Ios Swift&;核心数据-将实体添加到现有实体,ios,swift,core-data,Ios,Swift,Core Data,我知道关于核心数据和关系的问题经常出现,但我保证这是不同的:) 我有两个表,一个“作业”表和一个“方案”表 应用程序加载时填充scheme表,到目前为止一切正常 我理解,当我创建一个新的“作业”时,我需要获取正确的“方案”,然后将该方案附加到作业 我的问题是,在进行提取时,我已经在临时上下文中,这只会导致零解包裹错误并失败,我认为这与我在managedObjectContext上已挂起操作时尝试执行提取请求有关 下面是一些代码,可以概括我的位置: for (index, object) in o
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,但后来意识到这显然不是答案
任何帮助都将不胜感激:)我建议在主线程上下文中执行所有操作。如果您无法做到这一点,请在相同的背景环境中执行所有操作 如果您使用的是“获取结果”控制器,它将为您执行查找。您的用户可能选择了一个
方案
,因此
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 */ }
我建议在主线程上下文中执行所有操作。如果您无法做到这一点,请在相同的背景环境中执行所有操作 如果您使用的是“获取结果”控制器,它将为您执行查找。您的用户可能选择了一个
方案
,因此
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 */ }
我建议在主线程上下文中执行所有操作。如果您无法做到这一点,请在相同的背景环境中执行所有操作 如果您使用的是“获取结果”控制器,它将为您执行查找。您的用户可能选择了一个
方案
,因此
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 */ }
我建议在主线程上下文中执行所有操作。如果您无法做到这一点,请在相同的背景环境中执行所有操作 如果您使用的是“获取结果”控制器,它将为您执行查找。您的用户可能选择了一个
方案
,因此
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 */ }
您是否尝试过无块重构,仅使用主线程管理的对象上下文?您是否尝试过无块重构,仅使用主线程管理的对象上下文?您是否尝试过无块重构,仅使用主线程管理的对象上下文?您是否尝试过无块重构,仅仅使用主线程管理的对象上下文?