2016-05-11 2 views
1

Я пытаюсь использовать NSBatchUpdateRequest для обновления отношений «один ко многим».NSBatchUpdateRequest для отношений «один ко многим»

Моя сущность, Презентация, имеет несколько слайдов, которые являются еще одним объектом, и они имеют обратную связь.

enter image description here enter image description here

Когда я пытаюсь обновить слайды, я получаю эту ошибку:

*** Нагрузочного приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: «Invalid отношения ((), имя слайды, isOptional 1, isTransient 0, объектные презентации, слайды, renamingIdentifier проверка предикаты ( ), предупреждение ( ), versionHashModifier (нуль) USERINFO { } назначение объект Slide, inverseRelationship презентация, 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 обновляется просто отлично, так что я не думаю, что это правильный способ обновления отношений.

Если кому-то нужно больше кода, пожалуйста, дайте мне знать. Спасибо за любую помощь.

+0

Почему вы используете 'NSBatchUpdateRequest'? Это будет обновлять * каждый * Презентация с новыми 'date_updated' и' слайдами'. Это то, что вы хотите? – pbasdf

+0

@pbasdf Нет. Я мог бы использовать выборку, обновление и сохранение, которая будет только обновлять представление, которое я хочу, правильно? Первый раз, используя Core Data, я не уверен. – sallyp

+0

Да - обычный NSFetchRequest (с предикатом для получения только желаемого представления), а затем обновить атрибут date_updated, а отношение слайдов, а затем сохранить, должно сделать трюк. – pbasdf

ответ

1

Я думаю, вам нужно отделить этот запрос партии на двоих, один для класса представления экземпляров:

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

Второй для экземпляров класса Слайды, которые можно фильтровать с помощью предиката:

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] 
Смежные вопросы