核心数据:重新设置一对多关系
-
18-09-2019 - |
题
我创建的模型,你可以看到有: http://i.imagehost.org/0836/2009-11-08_14_37_41。 PNG
我想存储有关声音类别的信息和一些示例听起来为每个类别。 类别具有名称(的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:]
方法和 QUIT APP
当我relaund我的应用程序,并做
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与含有5个其他声音一些其他的NSSet: [类别的setValue:otherSetWithFiveSounds forKeyPath:@ “SoundsRelation”];
和做: 的NSLog(@ “描述:\ N%@”,类别);
我看到: 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>
);
我看到OLD SOUNDS +新的声音! 为什么?我应该怎么做才能完全覆盖旧关系,建立新的关系?
解决方案
此行:
[category setValue:nil forKeyPath:@"SoundsRelation"];
不会从ManagedObjectContext取出声音。它只是打破了类别对象和声音对象之间的联系。因为它创建持久存储孤立对象CoreData不喜欢这样。当您重新启动,CoreData假设错误孤立的对象,并重新分配他们到原来的母公司。
您应该使用显式“ManagedObjectContext DeleteObject的:`命令删除的声音,你需要确保你有适当的删除规则的关系设定。