代码之家  ›  专栏  ›  技术社区  ›  beefon

核心数据:重新设置为多个关系

  •  0
  • beefon  · 技术社区  · 16 年前

    我已经创建了模型,您可以在其中看到: http://i.imagehost.org/0836/2009-11-08_14_37_41.png

    我想为每个类别存储关于声音类别和一些示例声音的信息。 类别有名称(nsstring)和声音相关性(nsset of nsdata,它表示声音)。

    问题是: 例如,我有一个类别,其中包含几个与之相关联的声音。假设声音数为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>
    );
    

    然后我想清除这类声音。我想把音效设定为零。

    我愿意:

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

    现在如果我这样做

    nslog(@“描述:\n%@”,类别);
    

    我会有一些像:

    Name = "Cat1";
    SoundsRelation =     (
    );
    

    嗯,看来1类没有与之相关的声音。

    现在,我使用保存ManagedObjectContext [managedObjectContext save:] 方法及 退出应用程序 .

    当我重新启动应用程序时

    nslog(@“描述:\n%@”,类别);
    

    我将拥有:

    Name=“CAT1”;
    声音相关性=(
    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覆盖声音相关性: [类别设置值:OtherSetWithFivesounds ForkeyPath:@“SoundsRelation”];

    做: nslog(@“描述:\n%@”,类别);

    我懂了: name=“1类”; 声音相关性=( 0x174E90, 0x174EF0, 0x174ab0, 0x1743b0, 0x17440B0 ;

    现在,如果我保存、退出并重新启动,则在登录类别后,我会看到:

    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>
    );
    

    我看到旧的声音+新的声音! 为什么?我该怎么做才能完全将旧关系凌驾于新关系之上?

    1 回复  |  直到 16 年前
        1
  •  1
  •   TechZen    16 年前

    这条线:

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

    不会从ManagedObjectContext中删除声音。它只是破坏了Category对象和Sounds对象之间的链接。CoreData不喜欢这样,因为它在持久存储中创建了孤立的对象。重新启动时,coredata假定一个错误孤立了这些对象,并将它们重新分配给它们的原始父对象。

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