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

StackOverflow https://stackoverflow.com/questions/1696181

Вопрос

Я создал модель, которую вы можете увидеть здесь: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 на ноль.

Я делаю:

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

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

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

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

Name = "Cat1";
SoundsRelation =     (
);

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

Теперь я сохраняю свой управляемыйObjectContext, используя [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 ДРУГИХ звуков:[категория setValue:otherSetWithFiveSounds forKeyPath:@"SoundsRelation"];

И делай:NSLog(@"description: %@", категория);

Я понимаю:Имя = "Кот1";SoundsRelation = (0x174E90, 0x174EF0, 0x174ab0, 0x1743b0, 0x17444b0);

Теперь, если я сохраню, выйду и перезапущу, после 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>
);

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

Это было полезно?

Решение

Эта строка:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top