Pergunta

Tenho modelo que você pode ver, há criado: http://i.imagehost.org/0836/2009-11-08_14_37_41. png

Eu quero armazenar informações sobre categorias de som e alguns sons de amostra para cada categoria. Categoria tem Nome (NSString) e SoundsRelation (NSSet de NSData, que representa sons).

Aqui está o problema: Por exemplo, eu tenho alguma categoria que contém vários sons associados. Suponha número de sons é 3. Então, se eu faço

NSLog(@"description: \n%@", category);

I verá informações sobre Nome e esses três sons. Algo parecido com isto:

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>
);

Então eu quero limpar esta categoria de sons. Quero conjunto SoundsRelation a zero.

eu faço:

[category setValue:nil forKeyPath:@"SoundsRelation"];

Agora, se eu faço

NSLog(@"description: \n%@", category);

Vou ter algo como:

Name = "Cat1";
SoundsRelation =     (
);

Bem, parece que Cat1 não tem sons associados com ele.

Agora eu salvar meu managedObjectContext usando o método [managedObjectContext save:] e Sair APP .

Quando eu relaund meu aplicativo e fazer

NSLog(@"description: \n%@", category);

Vou ter:

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>
);

Eu vejo meus sons anteriores!

Agora, se eu substituir SoundsRelation com algum outro NSSet que contém 5 outros sons: [Categoria setValue: otherSetWithFiveSounds forKeyPath: @ "SoundsRelation"];

E fazer: NSLog (@ "descrição: \ n% @", categoria);

Eu vejo: Name = "Cat1"; SoundsRelation = ( 0x174e90, 0x174ef0, 0x174ab0, 0x1743b0, 0x1744b0 );

Agora, se eu salvar, saia e relançamento, após NSLogging minha categoria I ver:

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>
);

Eu vejo velhos sons + novos sons! Por quê? O que devo fazer para substituir completamente as relações de idade para relações NOVO?

Foi útil?

Solução

Esta linha:

[category setValue:nil forKeyPath:@"SoundsRelation"];

Não remove os sons do ManagedObjectContext. Ele só quebra a ligação entre o objeto categoria e o objeto sons. CoreData não gosta disso porque cria objetos no armazenamento persistente órfão. Quando você reiniciar, CoreData assume que um erro órfãos os objetos e reatribui-los ao seu pai original.

Você deve usar o explícito 'ManagedObjectContext ExcluirObjeto: `comando para remover os sons e você precisa ter certeza de que o conjunto de regras de exclusão apropriado para o relacionamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top