Перемещение объекта CoreData между объектами не работает
У меня есть две сущности, и они имеют одни и те же три атрибута (name, desc, displayOrder), у обеих есть несколько записей, и моя цель - добавить / вставить каждый элемент из "Entity 1" в "Entity 2".
Близко, но не сигара
Я думаю, что мой код довольно близок. Распечатка консоли показывает, что мой код успешно отправляет каждый элемент в "Объекте 1" в "Объект 2" и сохраняет его. НО они экономят друг на друге! Первый элемент перемещается и сохраняется, затем второй элемент перемещается, но копируется поверх элемента, который был ранее перемещен. Конечный результат: только последний перемещенный элемент фактически отображается в финальной "сущности 2".
Вопрос: Как мне это исправить?
@IBAction func testOutMoveList(sender: AnyObject) {
//Setup 'Do Later' context
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)
//Get sorted CoreData list and assign it to targetList_Cntxt
let fetchRequest = NSFetchRequest(entityName: "Entity2")
let sortDescriptor = NSSortDescriptor(key: "displayOrder", ascending: true)
fetchRequest.sortDescriptors = [ sortDescriptor ]
do {
let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
if let results = fetchedResults {
entity2_Cntxt = results
}
} catch {
print(error)
}
for i in 0..<entity1.count {
//Grab a Today task item
let itemToMove = entity1_Cntxt[i]
//Assign the Today item's contents to variables
let nameToTransfer = itemToMove.valueForKey("name") as? String
let descToTransfer = itemToMove.valueForKey("desc") as? String
//Assign the Today item's contents to the target's 'task' object
new_Ent2_Item.setValue(nameToTransfer, forKey: "name")
new_Ent2_Item.setValue(descToTransfer, forKey: "desc")
//Insert the item!!
entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0)
}
//Updates target list in Core Data after append, delete, and drag/drop
func update_TargetDisplayOrder() {
for i in 0..<entity2_Cntxt.count {
let item = entity2_Cntxt[i]
item.setValue( i, forKey: "displayOrder" )
}
}
Возможная подсказка: я заметил, что displayOrder, кажется, не обновляется правильно. Первый элемент должен быть 0, второй должен быть 1 и т. Д., Но вместо этого каждый раз, когда код циклически повторяется, наименьший displayOrder становится на 1 выше (список из трех элементов может начинаться со значений 2,3,4 - тогда мой код перемещает / копирует другой элемент для объекта 2, и значения порядка отображения: 3,4,5)
Вопрос: Какой код я могу добавить или исправить, чтобы сделать эту передачу я пытаюсь работать!?!
Бонусный вопрос: пост-перевод, как мне быстро / легко очистить все значения из "сущности 1"
1 ответ
Короткий ответ: вам нужно переместить эту строку:
let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)
так что это внутри цикла for:
for i in 0..<entity1.count {
//Grab a Today task item
let itemToMove = entity1_Cntxt[i]
// Create the corresponding new Entity2 object:
let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)
//Assign the Today item's contents to variables
let nameToTransfer = itemToMove.valueForKey("name") as? String
let descToTransfer = itemToMove.valueForKey("desc") as? String
//Assign the Today item's contents to the target's 'task' object
new_Ent2_Item.setValue(nameToTransfer, forKey: "name")
new_Ent2_Item.setValue(descToTransfer, forKey: "desc")
//Insert the item!!
entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0)
}
Чтобы объяснить: insertNewObjectForEntityForName
это то, что на самом деле создает новый объект Entity2. В исходном положении эта строка запускается только один раз, поэтому создается только один объект Entity2. Ваш for
Затем цикл изменяет значения атрибутов и вставляет их в начало entity2_Cntxt
массив (несколько раз). Обратите внимание, что последний шаг в for
петли, entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0)
не создает новый объект и не копирует new_Ent2_Item
, он просто вставляет его в начало массива. С исправленным кодом новый объект Entity2 будет создаваться каждый раз в цикле.
Учитывая displayOrder
проблема, если вы осмотрите entity2_Cntxt
При каждом выполнении массива через цикл вы должны обнаружить (с вашим исходным кодом), что массив содержит один и тот же объект Entity2 несколько раз, а затем объекты, полученные из выборки. предполагать entity2_Cntxt
содержит новый объект три раза (по индексам 0,1,2). Ваш update_TargetDisplayOrder
Метод будет затем установить этот объект displayOrder
до 0, затем 1, затем 2. И тогда объекты, возвращаемые извлечением, будут иметь displayOrder
3, 4 и т. Д. Я думаю, что все это будет хорошо, когда вы перемещаете insertNewObjectForEntityForName
как указано выше.