Iphone 核心数据:重新设置为多个关系
我创建了一个模型,您可以在那里看到: 我想存储有关声音类别的信息以及每个类别的一些示例声音。 类别有名称(NSString)和声音关系(NSData的NSSet,表示声音) 问题是: 例如,我有一个类别,其中包含几个与之相关的声音。假设声音的数量是3。 所以如果我这样做了Iphone 核心数据:重新设置为多个关系,iphone,core-data,one-to-many,relation,Iphone,Core Data,One To Many,Relation,我创建了一个模型,您可以在那里看到: 我想存储有关声音类别的信息以及每个类别的一些示例声音。 类别有名称(NSString)和声音关系(NSData的NSSet,表示声音) 问题是: 例如,我有一个类别,其中包含几个与之相关的声音。假设声音的数量是3。 所以如果我这样做了 NSLog(@"description: \n%@", category); 我将看到关于名字和这三个音的信息。大概是这样的: Name = "Cat1"; SoundsRelation = ( 0x174
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>
);
现在如果我这样做了
NSLog(@"description: \n%@", category);
我要的是:
Name = "Cat1";
SoundsRelation = (
);
嗯,似乎Cat1没有与之相关的声音
现在我使用[managedObjectContext save:
方法保存我的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>
);
Name=“Cat1”;
声音相关=(
0x174e90,
0x174ea0,
0x174eb0
);
我看到我以前的声音了
现在,如果我用其他包含5种其他声音的NSSet覆盖SoundsRelation:
[category setValue:otherSetWithFiveSounds forKeyPath:@“SoundsRelation”]
并且做:
NSLog(@“说明:\n%@”,类别)
我明白了:
Name=“Cat1”;
声音相关=(
0x174e90,
0x174ef0,
0x174ab0,
0x1743b0,
0x1744b0
);
现在,如果我保存、退出并重新启动,在记录我的类别后,我会看到:
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>
);
Name=“Cat1”;
声音相关=(
0x174e90,
0x174ea0,
0x174eb0,
0x174e90,
0x174ef0,
0x174ab0,
0x1743b0,
0x1744b0
);
我看到旧的声音+新的声音!
为什么?如何将旧关系完全覆盖为新关系?此行:
[category setValue:nil forKeyPath:@"SoundsRelation"];
不会从ManagedObjectContext中删除声音。它只是打断了category对象和sounds对象之间的链接。CoreData不喜欢这样,因为它在持久存储中创建孤立对象。重新启动时,CoreData假定错误孤立了对象,并将其重新分配给其原始父对象
您应该使用显式的“ManagedObjectContext deleteObject:”命令删除声音,并且需要确保为关系设置了适当的删除规则 我需要注意的是,所有托管对象(所有实体)都处于相同的上下文中。谢谢您的回复,TechZen。但是removeSoundsRelation呢?当我使用这种方法时,记录也在修复。这种方法也会破坏链接吗?
[category setValue:nil forKeyPath:@"SoundsRelation"];