核心数据删除对象函数

问题描述:

我有一个与核心数据相关的问题以及在为某个实体创建NSManagedObject子类时自动创建的删除对象函数。 我必须要实体;一个叫Label,有一个关系叫艺术家,另一个叫艺术家,有一个叫label的关系。艺术家关系目标是具有设置为标签的反比关系的实体艺术家。核心数据删除对象函数

我添加了一些“艺术家”具有相同的名称(弗里基·泽基),我尝试使用下一个代码

NSError *error = nil; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

// Grab the artist and delete 
Artist *freekey = [fetchedObjects objectAtIndex:0]; 
[freekey.label remove ArtistsObject:freekey]; 


// Save everything 
if([context save:&error]) 
{ 
    NSLog(@"The save was successful!"); 
} 
else 
{ 
    NSLog(@"The save wasn't successful: %@", [error localizedDescription]); 
} 

执行此代码后删除它们,我读出的数据,但当我只有一个“Freekey Zekey”时,艺术家才会被删除。但是,当我再次运行应用程序时,fetchedObjects中的对象数量仍然是一个。如果我有一个以上的“Freekey Zekey”,我希望只有一个被删除,但不会发生。

我尝试使用此代码删除所有“弗里基·泽基”

for(int i=0; i < [fetchedObjects count]; i++) 
{ 
    freekey = [fetchedObjects objectAtIndex:i]; 

    [freekey.label remove ArtistsObject:freekey]; 
} 

和它的作品,但是当我检查对象的号码fetchedObjects它不是0,我相信,是指物体避风港”没有被删除。

我该如何彻底删除一个对象?

答案是:您不会从数据库中完全删除艺术家。你只是删除关系,并完成删除,你也需要删除艺术家。

for(int i=0; i < [fetchedObjects count]; i++) 
{ 
    freekey = [fetchedObjects objectAtIndex:i]; 
    [freekey.label removeArtistsObject:freekey]; 
    [context deleteObject:freekey]; 
} 
if([context save:&error]) 
{ 
    NSLog(@"The save was successful!"); 
} 
else 
{ 
    NSLog(@"The save wasn't successful: %@", [error localizedDescription]); 
} 

希望它有帮助。

+2

如果您将“标签”关系的“删除规则”设置为“Nullify”,那么您只需删除Artists对象,它将自动从标签中删除。 – 2013-02-19 07:55:04

+0

是的,这在很多常见的情况下都适用。但我更喜欢明确删除关系,而不是等待CoreData处理其更改。我的意见更安全。思考。 – 2013-02-19 08:15:53

+0

谢谢你的回复。 您的代码完美工作,我能够更好地理解我应该如何从Core Data中移除对象。 – 2013-02-20 16:16:04

苹果文档在这方面并不十分清楚。一般的方法是苹果建议:

Data *lastData = [[self sortedPersonDatas] objectAtIndex:0]; 
[selectedPerson removePersonDataObject:lastData]; 

其中PersonData是一个一对多的关系,数据管理对象从我拍摄的最后数据(lastData导致所有数据的有序数组) 但使用工厂移除方法并检查后面的SQL数据库,我们可以发现实际的数据存在正好相反的关系为空。要完全删除必须使用的数据(所有属性和对象):

[selectedPerson.managedObjectContext deleteObject:lastData]; 

这将在保存上下文时完全删除记录。 正确的文档from Apple