我创建了你可以在那里看到的模型: http://i.imagehost.org/0836/2009-11-08_14_37_41.png
我想存储有关每个类别的声音类别和一些示例声音的信息。 Category有Name(NSString)和SoundsRelation(NSData的NSSet,代表声音)。
问题在于: 例如,我有一些类别,其中包含与之相关的几个声音。假设声音数量为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设置为nil。
我做:
[category setValue:nil forKeyPath:@"SoundsRelation"];
现在,如果我这样做
NSLog(@"description: \n%@", category);
我会有类似的东西:
Name = "Cat1";
SoundsRelation = (
);
好吧,似乎Cat1没有与之相关的声音。
现在我使用[managedObjectContext save:]
方法和退出APP 保存我的managedObjectContext。
当我重新启动我的应用并执行
时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>
);
我看到我以前的声音!
现在,如果我用其他一些包含5个其他声音的NSSet覆盖SoundsRelation: [categoryValue:otherSetWithFiveSounds forKeyPath:@“SoundsRelation”];
并做: NSLog(@“description:\ n%@”,类别);
我明白了: 名称=“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>
);
我看到了旧的声音+新的声音! 为什么?我该怎么做才能完全覆盖OLD与NEW关系的关系?
答案 0 :(得分:1)
这一行:
[category setValue:nil forKeyPath:@"SoundsRelation"];
不会从ManagedObjectContext中删除声音。它只是打破了类别对象和声音对象之间的联系。 CoreData不喜欢它,因为它在持久性存储中创建孤立对象。重新启动时,CoreData假定错误孤立对象并将其重新分配给其原始父级。
您应该使用显式的'ManagedObjectContext deleteObject:`命令来删除声音,并且您需要确保为关系设置了相应的删除规则。