【问题标题】:Removal of core data object does not nullify all of its relations?删除核心数据对象不会取消其所有关系吗?
【发布时间】:2013-05-23 10:28:59
【问题描述】:

我有一个名为 Task 的实体,它与实体 TaskTemplateOccurrence 具有一对一的关系。这两个实体都与 Tasks 有一对多关系。删除规则设置为 Nullify。

在一次发生中,我尝试删除所有任务。为此,我使用以下代码:

- (bool)removeAllTasks
{
    NSMutableSet *tasks = [self mutableSetValueForKey:@"tasks"];
    [tasks removeAllObjects];
    return YES;
}

这不起作用。以下是尝试删除之前的任务和发生:

Relationship 'tasks' on managed object (0x1006bd1c0) <Occurrence: 0x1006bd1c0> (entity: Occurrence; id: 0x102119510 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/Occurrence/p1> ; data: {
    ... bunch of properties ...
    taskType = "0x10211a020 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/TaskTemplate/p2>";
    tasks =     (
        "0x1021185e0 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/Task/p3>"
    );
}) with objects {(
    <Task: 0x10c31d700> (entity: Task; id: 0x1021185e0 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/Task/p3> ; data: {
    ... some more properties ...
    occurrence = "0x102119510 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/Occurrence/p1>";
    persons = "<relationship fault: 0x10e049e90 'persons'>";
    startDate = "2013-01-28 11:00:00 +0000";
    type = "0x10211a020 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/TaskTemplate/p2>";
})
)}

...这是-removeAllObjects之后的结果:

Relationship 'tasks' on managed object (0x1006bd1c0) <Occurrence: 0x1006bd1c0> (entity: Occurrence; id: 0x102119510 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/Occurrence/p1> ; data: {
    ... bunch of properties ...
    taskType = "0x10211a020 <x-coredata://6A0ECEF9-473D-44B2-9E89-AC15179D7761/TaskTemplate/p2>";
    tasks =     (
    );
}) with objects {(
)}

请注意,tasks 关系现在是空的,正如我所期望的那样。但我也希望 taskType 为空。我做错了什么?

编辑:

我更改了代码,以便查看该任务是否标记为已删除。我现在有:

- (bool)removeAllEvents
{
    NSMutableSet *tasks = [self mutableSetValueForKey:@"tasks"];
    [tasks enumerateObjectsUsingBlock:^(Task *task, BOOL *stop)
     {
    if (![task isDeleted])
         [self.managedObjectContext deleteObject:task];
         NSLog(@"Deleted %@", [task isDeleted] ? @"Y" : @"N");
     }];
    [self.managedObjectContext processPendingChanges];
    return YES;
}

它确实显示“Y”,表示该任务已标记为删除。 fetchRequest 显示上下文中没有任务。但是如果我尝试保存,我会收到一条不一致的消息(“任务无效”)。

【问题讨论】:

  • Occurrence 中的每个任务使用类似[self.managedObjectContext deleteObject:aTask]; 的东西,但为什么-removeAllObjects 方法不起作用?我认为它会起作用(tm)。

标签: objective-c cocoa core-data nsnotificationcenter nsmutableset


【解决方案1】:

您的removeAllTasks 方法不会删除任何对象。它只删除了从 Occurrence 对象到 Task 对象的关系,但任务继续存在。删除规则仅在对象被删除时应用(使用deleteObject:)。

【讨论】:

  • 我对核心数据还不是很满意,所以请原谅一个愚蠢的问题:我现在正在使用deleteObject: 方法,但是打印 [anOccurrence tasks] 显示了一个错误的任务,而不是什么都没有.我删除了任务,为什么它没有消失?这甚至在-processPendingChanges...
  • @markjs:deleteObject: 从存储中删除对象,但只要您有一个指向该对象的指针(“强引用”),对象就会继续存在于内存中。获取已删除对象的任何属性都将失败,但 isDeleted 将返回 YES。 - 我希望这是有道理的,这有点难以解释。
  • 确实如此。因此,要删除任务,我应该遍历 Occurrence 具有的所有关系,并在其上使用 deleteObject。完成后,我应该能够安全地保存数据文件,而不会出现不一致的情况。对吗?
  • 不起作用。如果我使用获取请求在上下文中请求任务,我什么也得不到(我认为是正确的)。但是当我打印 NSMutableSet occurrence.tasks 中的项目数时,我得到一个项目(这是一个错误)。这个项目搞砸了保存;我得到一个不一致的地方。这让我抓狂:(
  • @markjs:也许你已经为任务关系设置了一个“最小计数”?
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多