核心数据:重新设定多对多关系

时间:2009-11-08 12:03:33

标签: iphone core-data one-to-many relation

我创建了你可以在那里看到的模型: 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关系的关系?

1 个答案:

答案 0 :(得分:1)

这一行:

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

不会从ManagedObjectContext中删除声音。它只是打破了类别对象和声音对象之间的联系。 CoreData不喜欢它,因为它在持久性存储中创建孤立对象。重新启动时,CoreData假定错误孤立对象并将其重新分配给其原始父级。

您应该使用显式的'ManagedObjectContext deleteObject:`命令来删除声音,并且您需要确保为关系设置了相应的删除规则。