NSBatchUpdateRequest用于一对多关系

时间:2016-05-11 18:00:32

标签: ios swift core-data

我正在尝试使用NSBatchUpdateRequest来更新一对多关系。

我的实体Presentation有多个Slide,它是另一个实体,它们之间存在反比关系。

enter image description here enter image description here

当我尝试更新幻灯片时,出现此错误:

***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'无效关系((),名称幻灯片,isOptional 1,isTransient 0,实体演示文稿,renamingIdentifier幻灯片,验证谓词( ),警告( ),versionHashModifier(null)  用户信息 { },目标实体Slide,inverseRelationship presentation,minCount 0,maxCount 0,isOrdered 0,deleteRule 1)传递给propertiesToUpdate:'

我试图搜索此错误,但无法找到任何结果。

我的代码:

let entity = NSEntityDescription.entityForName("Presentation", inManagedObjectContext: managedObjectContext)
let batchRequest = NSBatchUpdateRequest(entity: entity!)
batchRequest.resultType = .UpdatedObjectIDsResultType
batchRequest.propertiesToUpdate = ["date_updated": formattedDateUpdated, "slides": presentationSlides]

do {
      let batchUpdateResult = try managedObjectContext.executeRequest(batchRequest) as! NSBatchUpdateResult
      let objectIds = batchUpdateResult.result as! [NSManagedObjectID]

      for objectId in objectIds {
          let managedObject = managedObjectContext.objectWithID(objectId)

          managedObjectContext.refreshObject(managedObject, mergeChanges: false)
      }
 } catch {
          let updateError = error as NSError
          print(updateError)
 }

date_updated更新得很好,所以我不认为这是更新关系的正确方法。

如果有人需要更多代码,请告诉我们。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我认为您需要将此批量请求分开为两个, 一个用于Presentation类实例:

let entity = NSEntityDescription.entityForName("Presentation", inManagedObjectContext: managedObjectContext)
let batchRequest = NSBatchUpdateRequest(entity: entity!)
batchRequest.resultType = .UpdatedObjectIDsResultType
batchRequest.propertiesToUpdate = ["date_updated": formattedDateUpdated]

第二个是Slides类实例,您可以使用谓词过滤:

let entity = NSEntityDescription.entityForName("Slide", inManagedObjectContext: managedObjectContext)
let batchRequest = NSBatchUpdateRequest(entity: entity!)
batchRequest.resultType = .UpdatedObjectIDsResultType
batchRequest.predicate = NSPredicate(format: "presentation = %@ \(somePresentation)");
batchRequest.propertiesToUpdate = ["some_property": newValue]