核心数据删除对象功能

时间:2013-02-19 06:41:52

标签: iphone xcode object core-data

我有一个与Core Data相关的问题,以及在为某个实体创建NSManagedObject子类时自动创建的remove对象函数。 我有实体;一个名为Label,一个名为艺术家的关系,另一个名为Artist的实体,它有一个名为label的关系。艺术家关系目的地是实体艺术家,其反向关系设置为标签。

我添加了几个同名的“艺术家”(Freekey Zekey),我试图使用下一个代码删除它们

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”,我希望只有一个被删除,但它不会发生。

我尝试使用此代码删除所有“Freekey Zekey”

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

    [freekey.label remove ArtistsObject:freekey];
}

它可以工作但是当我检查fetchedObjects中的对象数量时,它不是0,我相信这意味着对象没有被移除。

如何完全删除对象?

2 个答案:

答案 0 :(得分:3)

答案是:您没有从DB中完全删除艺术家。您刚刚删除了关系并完成删除,您还需要删除艺术家。

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

希望它有所帮助。

答案 1 :(得分:2)

Apple docs在这方面并不是很清楚。一般的方法是Apple建议的:

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

其中PersonData是与数据管理对象的一对多关系,我从中获取了最后一个数据(lastData来自所有数据的排序数组) 但是使用工厂删除方法并检查后面的SQL数据库,我们可以发现实际数据只是存在反向关系为null。要完全删除您必须使用的数据(所有属性和对象):

[selectedPerson.managedObjectContext deleteObject:lastData];

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