0

エンティティTaskTemplateおよびOccurrenceと対1の関係にあるTaskというエンティティがあります。これらのエンティティは両方とも、Tasksと対多の関係にあります。削除ルールは無効化に設定されています。

Occurrence内で、すべての Task を削除しようとします。そのために、次のコードを使用します。

- (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 は、コンテキストにタスクが残っていないことを示しています。しかし、保存しようとすると、矛盾したメッセージ (「タスクが無効です」) が表示されます。

4

1 に答える 1

2

removeAllTasksメソッドはオブジェクトを削除しません。OccurrenceオブジェクトからTaskオブジェクトへの関係が削除されるだけですが、タスクは引き続き存在します。削除ルールは、オブジェクトが ( を使用してdeleteObject:) 削除された場合にのみ適用されます。

于 2013-05-23T10:58:14.223 に答える