Основные данные: переустановка отношения ко многим

Я создал модель, которую вы можете увидеть здесь: http://i.imagehost.org/0836/2009-11-08_14_37_41.png

Я хочу сохранить информацию о категориях звуков и несколько примеров звуков для каждой категории. Категория имеет Имя (NSString) и SoundsRelation (NSSet из NSData, который представляет звуки).

Вот проблема: например, у меня есть категория, которая содержит несколько связанных с ней звуков. Предположим, что количество звуков равно 3. Итак, если я это сделаю

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

Я увижу информацию о названии и этих трех звуках. Что-то вроде этого:

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

Затем я хочу очистить эту категорию звуков. Я хочу установить SoundsRelation равным нулю.

I do:

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

Теперь, если я сделаю

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

У меня будет что-то вроде:

Name = "Cat1";
SoundsRelation =     (
);

Что ж, похоже, что Cat1 не имеет связанных звуков.

Теперь я сохраняю свой managedObjectContext с помощью метода [managedObjectContext save:] и ВЫЙТИ ИЗ ПРИЛОЖЕНИЯ.

Когда я перезагружаю свое приложение и делаю

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

У меня будет:

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

Я вижу свои предыдущие звуки!

Теперь, если я переопределю SoundsRelation с другим NSSet, который содержит 5 ДРУГИХ звуков: [category setValue: otherSetWithFiveSounds forKeyPath: @ "SoundsRelation"];

И делаем: NSLog (@ "description: \ n% @", category);

Я вижу: Name = "Cat1"; SoundsRelation = (0x174e90, 0x174ef0, 0x174ab0, 0x1743b0, 0x1744b0);

Теперь, если я сохраню, выйду и перезапущу, после NSLogging моей категории я вижу:

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

Я вижу СТАРЫЕ ЗВУКИ + НОВЫЕ ЗВУКИ! Почему? Что мне делать, чтобы полностью заменить СТАРЫЕ отношения на НОВЫЕ отношения?


person beefon    schedule 08.11.2009    source источник
comment
Я должен отметить, что все управляемые объекты (всех сущностей) находятся в одном контексте.   -  person beefon    schedule 08.11.2009


Ответы (1)


Эта строка:

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

Не удаляет звуки из ManagedObjectContext. Он просто разрывает связь между объектом категории и объектом звуков. CoreData это не нравится, потому что он создает потерянные объекты в постоянном хранилище. При перезапуске CoreData предполагает, что объекты осиротели из-за ошибки, и переназначает их исходному родительскому объекту.

Вы должны использовать явную команду 'ManagedObjectContext deleteObject: `для удаления звуков, и вам нужно убедиться, что у вас есть соответствующий набор правил удаления для отношения.

person TechZen    schedule 08.11.2009
comment
Спасибо за ответ, TechZen. Но как насчет removeSoundsRelation :? Когда я использую этот метод, восстанавливаются и записи. Этот метод тоже просто разрывает связь? - person beefon; 09.11.2009