personas - eliminar lista de recordatorios iphone
Un NSManagedObjectContext no puede eliminar objetos en otros contextos (4)
Tengo dos entidades, cada una se muestra en su propia sección UITableView.
He habilitado la edición para permitir al usuario eliminar filas al deslizar hacia la derecha. Esto funciona bien para la primera entidad, pero cuando intento eliminar un objeto en la segunda entidad, aparece este error:
An NSManagedObjectContext cannot delete objects in other contexts
Entiendo lo que dice el error, pero no puedo ver cómo se aplica aquí. Utilizo una referencia retenida a mi contexto para crear, buscar y eliminar todos los objetos de la base de datos, así que estoy seguro de que solo hay un contexto. Tampoco estoy usando varios hilos. ¿Alguna idea de lo que podría estar pasando?
¿Es el contexto del que obtuvo el objeto NSManagedObject
, la misma instancia, que el contexto que está usando para eliminar el objeto NSManagedObject
? Si no, necesita:
- Tenga una referencia compartida al mismo
NSManagedObjectContext
para que elimine el objeto del mismo contexto en el que lo creó o lo obtuvo. Si no está utilizando varios subprocesos, solo debe llamar[[NSManagedObjectContext alloc] init]
una vez en su código.
o
Si tiene que usar dos instancias diferentes de
NSManagedObjectContext
, obtenga elobjectID
de objeto delNSManagedObject
que obtuvo del primer contexto, para poder llamar más tarde:[context deleteObject:[context objectWithID:aObjectID]];
El
NSManagedObjectID
es el mismo entre contextos, pero elNSManagedObject
sí no lo es.
Bueno, prueba esto; Esto puede resolver su problema:-
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//delete Entity
});
Luego se metió el mismo error.
Después de intentar eliminar la entidad en el hilo principal y este problema está solucionado.
Esta respuesta explica el caso descrito en los comentarios de Riley Dutton acerca de que el mensaje de error es engañoso.
El mensaje de error se mostrará cuando pase un objeto que no sea una subclase de NSManagedObject para deleteObject:
Riley resolvió el problema simplemente al pasar explícitamente el objeto equivocado, pero llegué allí por medio de cambios en los Datos Básicos.
El objetivo de mi proyecto de implementación se estableció en 7.0, y este código funcionó sin errores, incluso ejecutándose en iOS 9.3:
NSArray *entries = @[self.colorList.colors, self.emotionList.emotions, self.shapeList.shapes];
for (id entry in entries) {
[[self managedObjectContext] deleteObject:entry];
}
Cuando actualicé el destino de implementación del proyecto a 9.3, comencé a recibir el mensaje de error.
Aquí está la descripción de la entry
:
Relationship ''colors'' fault on managed object (0x7fd063420310) <MyColorList: 0x7fd063420310> (entity: MyColorList; id: 0xd000000000640006 <x-coredata://12556DEF-F77E-4EFF-AAE6-55E71A3F5420/MyColorList/p25> ; data: {
attachedThing = "0xd0000000000c0004 <x-coredata://12556DEF-F77E-4EFF-AAE6-55E71A3F5420/MyThing/p3>";
colors = "<relationship fault: 0x7fd063468f30 ''colors''>";
})
Parece que Apple cambió las reglas para cuando Core Data active una falla y en realidad extraiga los datos del coordinador de tienda persistente.
Esta modificación solucionó el problema:
NSArray *entries = @[self.colorList.colors, self.emotionList.emotions, self.shapeList.shapes];
for (id entry in entries) {
for (id e in entry) {
[[self managedObjectContext] deleteObject:e];
}
}
En este momento no sé si esta es la forma ideal de resolver este problema o si hay una manera más canónica de decirle a Core Data que active la falla y lea los datos del disco.
Yo uso esto:
func delete(object: YourManagedObject) {
guard let context = object.managedObjectContext else { return }
if context == self.viewContext {
context.delete(object)
} else {
self.performBackgroundTask { context in
context.delete(object)
}
}
try? self.viewContext.save()
}
Básicamente, es bastante probable que el objeto que desea eliminar lo haya proporcionado el viewContext de NSPersistentContainer . Así que tratar de eliminar el contexto de fondo privado no funcionará.