Основные данные:переустановка отношений ко многим
-
18-09-2019 - |
Вопрос
Я создал модель, которую вы можете увидеть здесь: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:», чтобы удалить звуки, и вам необходимо убедиться, что у вас есть соответствующий набор правил удаления для отношений.