Ios 如何在CoreData中将相关对象从一个对象移动到另一个对象

Ios 如何在CoreData中将相关对象从一个对象移动到另一个对象,ios,objective-c,core-data,Ios,Objective C,Core Data,我在CoreData中的一些数据库操作中遇到了问题。有时视图在过程中间刷新,显示错误状态。有时数据甚至会丢失 我有以下CoreData对象模型: 这门课有很多学生 现在我想把两门课程A和B合并在一起,这样以后,课程B的所有学生都应该被分配到课程A,而课程B不再存在 (一个学生正好在一门课上) 目前,我正在这样做,这在大多数情况下都有效,但存在以下问题: Course courseA = [self someCourse]; Course courseB = [self someOtherCour

我在CoreData中的一些数据库操作中遇到了问题。有时视图在过程中间刷新,显示错误状态。有时数据甚至会丢失

我有以下CoreData对象模型:

这门课有很多学生

现在我想把两门课程A和B合并在一起,这样以后,课程B的所有学生都应该被分配到课程A,而课程B不再存在

(一个学生正好在一门课上)

目前,我正在这样做,这在大多数情况下都有效,但存在以下问题:

Course courseA = [self someCourse];
Course courseB = [self someOtherCourse];

for (Student *student in courseB.students) {
    student.course = courseA;
}

[managedObjectContext deleteObject:courseB];

NSError *error = nil;
[managedObjectContext save:&error];
if(error != nil) {
    NSLog(@"Deletion of Course failed.");
}
有时在设备日志中会出现以下错误:

Core Data: warning: validation recovery attempt FAILED with Error Domain=NSCocoaErrorDomain Code=1550 "The operation couldn’t be completed. (Cocoa error 1550.)" UserInfo=0x1d97f8e0 {NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1550.), Dangling reference to an invalid object.=null, NSValidationErrorObject=<Course: 0x1cad56c0> (entity: Course; id: 0x1ca69380 <x-coredata:///Course/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D3519> ; data: {
    endDateTime = "2014-09-18 17:38:17 +0000";
    place = "0x1db4c120 <x-coredata:///Place/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D7394>";
    room = "0x18d696a0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Room/p1>";
    category = "0x18e8f990 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/CDCategory/p1>";
    changed = "2014-09-19 08:04:03 +0000";
    startDateTime = "2014-09-18 17:30:01 +0000";
    syncInfos = "<relationship fault: 0x1cbb5bb0 'syncInfos'>";
    students =     (
        "0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393>",
        "0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383>",
        "0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461401>",
        "0x1a0a6560 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461387>",
        "0x1c90e2f0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461346>",
        "0x1cd7fc00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461370>",
        "0x1a0bdbf0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461374>",
        "0x1cb11090 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461395>",
        "0x1cf31fc0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461379>",
        "0x1cda6230 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461339>",
        "(...and 133 more...)"
    );
}), NSAffectedObjectsErrorKey=(
    "<Student: 0x1cf6c000> (entity: Student; id: 0x1a36fc70 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461431> ; data: <fault>)"
), NSValidationErrorKey=students, NSValidationErrorValue=Relationship 'students' on managed object (0x1cad56c0) <Course: 0x1cad56c0> (entity: Course; id: 0x1ca69380 <x-coredata:///Course/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D3519> ; data: {
    endDateTime = "2014-09-18 17:38:17 +0000";
    place = "0x1db4c120 <x-coredata:///Place/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D7394>";
    room = "0x18d696a0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Room/p1>";
    category = "0x18e8f990 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/CDCategory/p1>";
    changed = "2014-09-19 08:04:03 +0000";
    startDateTime = "2014-09-18 17:30:01 +0000";
    syncInfos = "<relationship fault: 0x1cbb5bb0 'syncInfos'>";
    students =     (
        "0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393>",
        "0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383>",
        "0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461401>",
        "0x1a0a6560 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461387>",
        "0x1c90e2f0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461346>",
        "0x1cd7fc00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461370>",
        "0x1a0bdbf0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461374>",
        "0x1cb11090 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461395>",
        "0x1cf31fc0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461379>",
        "0x1cda6230 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461339>",
        "(...and 133 more...)"
    );
}) with objects {(
    <Student: 0x1d9e48d0> (entity: Student; id: 0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393> ; data: <fault>),
    <Student: 0x1ddc6920> (entity: Student; id: 0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383> ; data: <fault>),
    <Student: 0x1d991750> (entity: Student; id: 0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461455> ; data: <fault>),
    <Student: 0x1cf6c000> (entity: Student; id: 0x1a36fc70 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461431> ; data: <fault>)
)}, NSValidationErrorShouldAttemptRecoveryKey=true} and {
    "Dangling reference to an invalid object." = "<null>";
    NSAffectedObjectsErrorKey =     (
        "<Student: 0x1cf6c000> (entity: Student; id: 0x1a36fc70 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461431> ; data: <fault>)"
    );
    NSLocalizedDescription = "The operation couldn\U2019t be completed. (Cocoa error 1550.)";
    NSValidationErrorKey = students;
    NSValidationErrorObject = "<Course: 0x1cad56c0> (entity: Course; id: 0x1ca69380 <x-coredata:///Course/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D3519> ; data: {\n    endDateTime = \"2014-09-18 17:38:17 +0000\";\n    place = \"0x1db4c120 <x-coredata:///Place/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D7394>\";\n    room = \"0x18d696a0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Room/p1>\";\n    category = \"0x18e8f990 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/CDCategory/p1>\";\n    changed = \"2014-09-19 08:04:03 +0000\";\n    startDateTime = \"2014-09-18 17:30:01 +0000\";\n    points = 1436;\n    done = 1;\n    notes = \"\";\n    syncInfos = \"<relationship fault: 0x1cbb5bb0 'syncInfos'>\";\n    students =     (\n        \"0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393>\",\n        \"0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383>\",\n        \"0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461401>\",\n        \"0x1a0a6560 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461387>\",\n        \"0x1c90e2f0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461346>\",\n        \"0x1cd7fc00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461370>\",\n        \"0x1a0bdbf0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461374>\",\n        \"0x1cb11090 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461395>\",\n        \"0x1cf31fc0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461379>\",\n        \"0x1cda6230 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461339>\",\n        \"(...and 133 more...)\"\n    );\n})";
    NSValidationErrorShouldAttemptRecoveryKey = 1;
    NSValidationErrorValue = "Relationship 'students' on managed object (0x1cad56c0) <Course: 0x1cad56c0> (entity: Course; id: 0x1ca69380 <x-coredata:///Course/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D3519> ; data: {\n    endDateTime = \"2014-09-18 17:38:17 +0000\";\n    place = \"0x1db4c120 <x-coredata:///Place/tA8FBABB4-2BBD-4A5D-ADFA-94D6F08F6A6D7394>\";\n    room = \"0x18d696a0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Room/p1>\";\n    category = \"0x18e8f990 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/CDCategory/p1>\";\n    changed = \"2014-09-19 08:04:03 +0000\";\n    startDateTime = \"2014-09-18 17:30:01 +0000\";\n    points = 1436;\n    done = 1;\n    notes = \"\";\n    syncInfos = \"<relationship fault: 0x1cbb5bb0 'syncInfos'>\";\n    students =     (\n        \"0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393>\",\n        \"0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383>\",\n        \"0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461401>\",\n        \"0x1a0a6560 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461387>\",\n        \"0x1c90e2f0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461346>\",\n        \"0x1cd7fc00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461370>\",\n        \"0x1a0bdbf0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461374>\",\n        \"0x1cb11090 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461395>\",\n        \"0x1cf31fc0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461379>\",\n        \"0x1cda6230 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461339>\",\n        \"(...and 133 more...)\"\n    );\n}) with objects {(\n    <Student: 0x1d9e48d0> (entity: Student; id: 0x18d073c0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461393> ; data: <fault>),\n    <Student: 0x1ddc6920> (entity: Student; id: 0x1c911b00 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461383> ; data: <fault>),\n    <Student: 0x1d991750> (entity: Student; id: 0x1c915770 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461433> ; data: <fault>),\n    <Student: 0x1dbb38f0> (entity: Student; id: 0x1c920ba0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461435> ; data: <fault>),\n    <Student: 0x1cf7b780> (entity: Student; id: 0x1c9298f0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461436> ; data: <fault>),\n    <Student: 0x1dd3f4f0> (entity: Student; id: 0x1a09a3b0 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461454> ; data: <fault>),\n    <Student: 0x1d9e4850> (entity: Student; id: 0x1cbbe040 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461455> ; data: <fault>),\n    <Student: 0x1cf6c000> (entity: Student; id: 0x1a36fc70 <x-coredata://16CBD0F6-B399-4A9C-BD51-5EC98BD99EFC/Student/p461431> ; data: <fault>)\n)}";
}.
核心数据:警告:验证恢复尝试失败,错误域=NSCOCAERRORDOMAIN code=1550“该操作无法完成。(Cocoa错误1550。)”UserInfo=0x1d97f8e0{NSLocalizedDescription=该操作无法完成。(Cocoa错误1550。),挂起对无效对象的引用。=null,NSValidationErrorObject=(实体:课程;id:0x1ca69380;数据:{
endDateTime=“2014-09-18 17:38:17+0000”;
place=“0x1db4c120”;
房间=“0x18d696a0”;
category=“0x18e8f990”;
已更改=“2014-09-19 08:04:03+0000”;
startDateTime=“2014-09-18 17:30:01+0000”;
syncInfos=“”;
学生=(
“0x18d073c0”,
“0x1c911b00”,
“0x1c915770”,
“0x1a0a6560”,
“0x1c90e2f0”,
“0x1cd7fc00”,
“0x1a0bdbf0”,
“0x1cb11090”,
“0x1cf31fc0”,
“0x1cda6230”,
“(……还有133个……)
);
}),NSAffectedObjectsErrorKey=(
“(实体:学生;id:0x1a36fc70;数据:)”
),NSValidationErrorKey=学生,NSValidationErrorValue=托管对象(0x1cad56c0)上的关系“学生”(实体:课程;id:0x1ca69380;数据:{
endDateTime=“2014-09-18 17:38:17+0000”;
place=“0x1db4c120”;
房间=“0x18d696a0”;
category=“0x18e8f990”;
已更改=“2014-09-19 08:04:03+0000”;
startDateTime=“2014-09-18 17:30:01+0000”;
syncInfos=“”;
学生=(
“0x18d073c0”,
“0x1c911b00”,
“0x1c915770”,
“0x1a0a6560”,
“0x1c90e2f0”,
“0x1cd7fc00”,
“0x1a0bdbf0”,
“0x1cb11090”,
“0x1cf31fc0”,
“0x1cda6230”,
“(……还有133个……)
);
})有物体{(
(实体:学生;id:0x18d073c0;数据:),
(实体:学生;id:0x1c911b00;数据:),
(实体:学生;id:0x1c915770;数据:),
(实体:学生;id:0x1a36fc70;数据:)
)},NSValidationErrorShouldAttemptRecoveryKey=true}和{
“挂起对无效对象的引用。”=“”;
NSAffectedObjectsErrorKey=(
“(实体:学生;id:0x1a36fc70;数据:)”
);
NSLocalizedDescription=“操作无法\u2019完成。(Cocoa错误1550)。”;
NSValidationErrorKey=学生;
NSValidationErrorObject=“(实体:课程;id:0x1ca69380;数据:{\n结束日期时间=\“2014-09-18 17:38:17+0000\”;\n地点=“0x1db4c120\”;\n房间=“0x18d696a0\”;\n类别=“0x18e8f990\”;\n更改=“2014-09-19 08:03+0000\”;\n开始日期时间=“2014-09-18 17:30:01+0000\“;\n points=1436;\n done=1;\n notes=\”;\n syncInfos=\“\”;\n students=(\n\“0x18d073c0\”、\n\“0x1c911b00\”、\n\“0x1c915770\”、\n\“0x1a0a6560\”、\n\“0x1c90e2f0\”、\n\“0x1cd7fc00\”、\n\“0x1a0bdbf0\”、\n\“0x1cb11090\”、\n\“0x1CF3\”、\n\“0x1cda6230\”、\n\“(…和133更多…)\”\n);\n})”;
NSValidationErrorShouldAttemptRecoveryKey=1;
NSValidationErrorValue=“托管对象(0x1cad56c0)上的关系‘学生’”(实体:课程;id:0x1ca69380;数据:{\n结束日期时间=\“2014-09-18 17:38:17+0000\”;\n地点=“0x1db4c120\”;\n房间=“0x18d696a0\”;\n类别=“0x18e8f990\”;\n更改=“2014-09-19 08:04+0000\”;\n开始日期时间=”2014-09-18 17:30:01+0000\;\n points=1436;\n done=1;\n notes=\“;\n syncInfos=\”;\n student=(\n\“0x18d073c0\”、\n\“0x1c911b00\”、\n\“0x1c915770\”、\n\“0x1a0a6560\”、\n\“0x1c90e2f0\”、\n\“0x1cd7fc00\”、\n\“0x1A0BF0\”、\n\“0x1CB10\”、\n\”0x1cf31fc0\“,\n\“0x1cda6230\”,\n\”(…和133更多…);\n})和对象{(\n(实体:学生;id:0x18d073c0;数据:),\n(实体:学生;id:0x1c911b00;数据:),\n(实体:学生;id:0x1c915770;数据:),\n(实体:学生;id:0x1c920ba0;数据:),\n(实体:学生;id:0x1c9298f0;数据:),\n(实体:学生;id:0x1a09a3b0;数据:),\n(实体:学生;id:0x1cbbe040;数据:),\n(实体:学生;id:0x1a36fc70;数据:)\n)}”;
}.

如果问题仅在处理更改时重新加载视图时发生,则您可以选择缓存数据并同步读写步骤,和/或仅在稳定状态下刷新视图(因此迁移方法在完成时发送通知)

如果在其他状态下也发生这种情况,则应检查模型中的选项(同步、验证、删除规则)或尝试先保存迁移的学生,然后删除

如果仍然不起作用,您能否提供模型和关系的屏幕截图

顺便问一下,为什么要迭代每个用户而不是使用

[courseB addStudents:courseA.students];
?当然,只有在您拥有
CoreDataGeneratedAccessor
的情况下:

@interface Course (CoreDataGeneratedAccessors)

- (void)addStudentsObject:(Student *)value;
- (void)removeStudentsObject:(Student *)value;
- (void)addStudents:(NSSet *)value;
- (void)removeStudents:(NSSet *)value;

@end

在你对Student.course的关系定义中,你有什么样的删除规则(可能是:“无操作”。我认为应该是“无效”)。 对无效对象的悬空引用通常在技术上与不正确设置的关系有关。另外,为了确保我会添加以下内容:courseB.student