Core Data: re-setting to-many relationship

纵然是瞬间 提交于 2019-12-12 01:18:04

问题


I have created model which you can see there: http://i.imagehost.org/0836/2009-11-08_14_37_41.png

I want to store information about sound categories and some sample sounds for each category. Category has Name (NSString) and SoundsRelation (NSSet of NSData, which represents sounds).

Here is the problem: For example I have some category which contains several sounds associated with it. Assume number of sounds is 3. So if I do

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

I will see information about Name and these three sounds. Something like this:

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

Then I want to clear this category of sounds. I want to set SoundsRelation to nil.

I do:

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

Now if I do

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

I will have something like:

Name = "Cat1";
SoundsRelation =     (
);

Well, it seems that Cat1 doesn't have sounds associated with it.

Now I save my managedObjectContext using [managedObjectContext save:] method and QUIT APP.

When I relaund my app and do

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

I will have:

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

I see my previous sounds!

Now, if I override SoundsRelation with some other NSSet which contains 5 OTHER sounds: [category setValue:otherSetWithFiveSounds forKeyPath:@"SoundsRelation"];

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

I see: Name = "Cat1"; SoundsRelation = ( 0x174e90 , 0x174ef0 , 0x174ab0 , 0x1743b0 , 0x1744b0 );

Now if I save, quit and relaunch, after NSLogging my category I see:

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

I see OLD SOUNDS + NEW SOUNDS! Why? What should I do to completely override OLD relations to NEW relations?


回答1:


This line:

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

Doesn't remove the sounds from the ManagedObjectContext. It just breaks the linkage between the category object and the sounds object. CoreData doesn't like that because it creates orphaned objects in the persistent store. When you restart, CoreData assumes that an error orphaned the objects and it reassigns them to their original parent.

You should use the explicit 'ManagedObjectContext deleteObject:` command to remove the sounds and you need to make sure you have the appropriate delete rule set for the relationship.



来源:https://stackoverflow.com/questions/1696181/core-data-re-setting-to-many-relationship

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!