Dati di base: re-impostazione a-molti
-
18-09-2019 - |
Domanda
Ho creato modello che potete vedere ci: http://i.imagehost.org/0836/2009-11-08_14_37_41. png
Voglio memorizzare le informazioni sulle categorie di suoni e alcuni campioni suoni per ogni categoria. Categoria dispone Nome (NSString) e SoundsRelation (NSSet di NSData, che rappresenta i suoni).
Qui è il problema: Per esempio io ho qualche categoria che contiene diversi suoni ad esso associati. Assumere il numero di suoni è 3. Quindi, se faccio
NSLog(@"description: \n%@", category);
vedrò informazioni su Nome e questi tre suoni. Qualcosa di simile a questo:
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>
);
Poi voglio chiarire questa categoria di suoni. Voglio impostare SoundsRelation a zero.
che faccio:
[category setValue:nil forKeyPath:@"SoundsRelation"];
Ora, se faccio
NSLog(@"description: \n%@", category);
avrò qualcosa di simile:
Name = "Cat1";
SoundsRelation = (
);
Bene, sembra che Cat1 non ha suoni associati con esso.
Ora salvare il mio managedObjectContext utilizzando il metodo [managedObjectContext save:]
e QUIT APP .
Quando ho relaund mia app e fare
NSLog(@"description: \n%@", category);
avrò:
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>
);
vedo i miei suoni precedenti!
Ora, se sovrascrivo SoundsRelation con qualche altra NSSet che contiene 5 altri suoni: [Categoria setValue: otherSetWithFiveSounds forKeyPath: @ "SoundsRelation"];
E fare: NSLog (@ "Descrizione: \ n% @", categoria);
vedo: Name = "Cat1"; SoundsRelation = ( 0x174e90, 0x174ef0, 0x174ab0, 0x1743b0, 0x1744b0 );
Ora, se li risparmio, chiudere e rilanciare, dopo NSLogging mia categoria vedo:
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>
);
vedo vecchie sonorità + Nuovi suoni! Perché? Cosa devo fare per ignorare completamente le relazioni vecchi ai nuovi rapporti?
Soluzione
Questa riga:
[category setValue:nil forKeyPath:@"SoundsRelation"];
non rimuove i suoni dal ManagedObjectContext. E 'appena rompe il legame tra l'oggetto e l'oggetto categoria suoni. CoreData non piace che perché crea oggetti orfani nella memoria permanente. Quando si riavvia, CoreData presuppone che un errore orfano gli oggetti e li riassegna al loro genitore originale.
Si dovrebbe usare l'esplicita 'ManagedObjectContext DeleteObject: comando `per rimuovere i suoni ed è necessario assicurarsi di avere la regola di eliminazione set appropriato per la relazione.