0

我创建了您可以在那里看到的模型: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 设置为零。

我愿意:

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

现在如果我这样做

NSLog(@"description: \n%@", category);

我会有类似的东西:

Name = "Cat1";
SoundsRelation =     (
);

好吧,Cat1 似乎没有与之相关的声音。

[managedObjectContext save:]现在我使用方法和QUIT 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:[category setValue:otherSetWithFiveSounds forKeyPath:@"SoundsRelation"];

然后做: NSLog(@"description: \n%@", category);

我看到:名称=“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>
);

我看到了旧声音 + 新声音!为什么?我应该怎么做才能完全覆盖旧关系到新关系?

4

1 回答 1

1

这一行:

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

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

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

于 2009-11-08T17:37:50.873 回答