Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据:重新设置为多个关系_Iphone_Core Data_One To Many_Relation - Fatal编程技术网

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

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

我创建了一个模型,您可以在那里看到:

我想存储有关声音类别的信息以及每个类别的一些示例声音。 类别有名称(NSString)和声音关系(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>
);
现在如果我这样做了

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"];