Datos Básicos: re-configuración a-muchos relación
-
18-09-2019 - |
Pregunta
He creado el modelo que se puede ver allí: http://i.imagehost.org/0836/2009-11-08_14_37_41. png
quiero para almacenar información acerca de las categorías de sonido y algunos sonidos de la muestra para cada categoría. Categoría tiene Nombre (NSString) y SoundsRelation (NSSet de NSData, que representa los sonidos).
Aquí está el problema: Por ejemplo, tengo alguna categoría que contiene varios sonidos asociados a ella. Supongamos número de sonidos es 3. Así que si lo hago
NSLog(@"description: \n%@", category);
veré información sobre Nombre y estos tres sonidos. Algo como esto:
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);
A continuación, quiero aclarar esta categoría de sonidos. Quiero configurar SoundsRelation a cero.
que hago:
[category setValue:nil forKeyPath:@"SoundsRelation"];
Ahora bien, si hago
NSLog(@"description: \n%@", category);
Voy a tener algo como:
Name = "Cat1";
SoundsRelation = (
);
Bueno, parece que no tiene Cat1 sonidos asociados a ella.
Ahora guardo mi managedObjectContext utilizando el método [managedObjectContext save:]
y QUIT APP .
Cuando relaund mi aplicación y hacer
NSLog(@"description: \n%@", category);
Tendré:
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);
Veo mis sonidos anteriores!
Ahora, si puedo reemplazar SoundsRelation con algún otro NSSet que contiene 5 otros sonidos: [Categoría setValue: otherSetWithFiveSounds forKeyPath: @ "SoundsRelation"];
Y hacer: NSLog (@ "Descripción: \ n% @", categoría);
veo: Name = "Cat1"; SoundsRelation = ( 0x174e90, 0x174ef0, 0x174ab0, 0x1743b0, 0x1744b0 );
Ahora si ahorro, dejar de fumar y relanzamiento, después NSLogging mi categoría que veo:
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>,
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p12>,
0x174ef0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p13>,
0x174ab0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p14>,
0x1743b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p15>,
0x1744b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p16>
);
Veo viejos sonidos nuevos sonidos +! ¿Por qué? ¿Qué debo hacer para anular por completo las relaciones viejo para las relaciones NUEVO?
Solución
Esta línea:
[category setValue:nil forKeyPath:@"SoundsRelation"];
No elimina los sonidos de la ManagedObjectContext. Me rompe el vínculo entre la categoría de objeto y el objeto sonidos. CoreData no le gusta eso, ya que crea objetos huérfanos en el almacén persistente. Al reiniciar, CoreData asume que un error huérfano los objetos y les reasigna a sus padres originales.
Se debe utilizar la explícita 'ManagedObjectContext deleteObject: comando `para eliminar los sonidos y que necesita para asegurarse de que tiene la norma de supresión conjunto apropiado para la relación.