如何通过核心数据关系删除所有对象?

如何解决如何通过核心数据关系删除所有对象?

| 假设我有一个自定义NSManagedobject
Department
,并且它具有一个表示与员工的一对多关系的属性,即
NSSet *employees;
。 对于给定的部门,我想删除员工中的所有对象。请执行此操作的推荐/最佳方法是什么? 因此,假设我的代码如下所示: 部门
@interface Department: NSManagedobject {
}
@property (retain) Nsstring *departmentName;
@property (retain) NSSet *employees;
@end
部门
@implementation Department
@dynamic departmentName;
@dynamic employees;
员工
@interface Employee: NSManagedobject {
}
@property (retain) Nsstring *firstName;
@property (retain) Nsstring *lastName;
@property (retain) Department *worksIn;
@end
doCoreDataStuff
- (void)doCoreDataStuff:sender {
    //add a department,give it a couple employees,then try to remove those employees
    NSEntityDescription *deptEntity = [NSEntityDescription entityForName:@\"Department\"
                                                 inManagedobjectContext:self.managedobjectContext];
    Department *dept = [Department alloc] initWithEntity:deptEntity
                          insertIntoManagedobjectContext:self.managedobjectContext];
    NSError *error;

    dept.departmentName = @\"Accounting\";
    //save more often than normal to see more easily what causes error
    if (![self.managedobjectContext save:&error]) NSLog(@\"\\nError: %@\",[error localizedDescription]);

    NSEntityDescription *empEntity = [NSEntityDescription entityForName:@\"Employee\"
                                                 inManagedobjectContext:self.managedobjectContext];
    emp.firstName = @\"Steve\";
    emp.lastName = @\"Smith\";
    emp.worksIn = dept;

    if (![self.managedobjectContext save:&error]) NSLog(@\"\\nError: %@\",[error localizedDescription]);

    emp = [[Employee alloc] initWithEntity:empEntity
            insertIntoManagedobjectContext:self.managedobjectContext];
    emp.firstName = @\"Natasha\";
    emp.lastName = @\"Johnson\";
    emp.worksIn = dept;

    if (![self.managedobjectContext save:&error]) NSLog(@\"\\nError: %@\",[error localizedDescription]);

    //all good so far! Now will try to delete all employees for this department
    dept.employees = [NSSet set];
    if (![self.managedobjectContext save:&error]) NSLog(@\"\\nError: %@\",[error localizedDescription]); //\"Multiple validation errors occurred.\"

    //this also produces the same error
    [[dept mutableSetValueForKey:@\"employees\"] removeAllObjects];
    if (![self.managedobjectContext save:&error]) NSLog(@\"\\nError: %@\",[error localizedDescription]); //\"Multiple validation errors occurred.\"
关系“ 6”不是可选的,因此我猜想从部门中撤离员工意味着我试图“孤立”员工,即,使员工处于没有关联部门的持久化模型中。 因此,我认为我的原始问题应该改写为:当孩子与父母之间存在非可选关系时,删除“父母”中所有“孩子”对象的最佳/推荐方法是什么? 我怀疑答案将是“遍历并一次删除一个雇员对象”。 更新 根据一个答案和指向Apple文档的链接,我应该能够将删除规则设置为“ Cascade”,然后像“ 7”这样的代码将起作用。但是,这在我非常简单的项目中不起作用,在该项目中我相应地设置了删除规则。 谢谢     

解决方法

        如果要删除特定部门的员工元素,则可以运行for循环
for (Employees * theEmployee in department.employees) {
  [self.managedObjectContext deleteObject:[self.managedObjectContext objectWithID:theEmployee.objectID]]; 
}
然后保存您的托管上下文。当然,这就是您想要的,并且不能消除员工与部门之间的关系;在这种情况下,可以分配一个空集。 上面的变化:
for (Employee *employeeToDelete in department.employees) {
    [self.managedObjectContext deleteObject:employeeToDelete];
}
    ,        将部门的员工关系设置为空集,无论删除规则如何,都不会删除员工。我相信您误解了删除规则。根据苹果文档: \“关系的删除规则指定了尝试删除源对象时应该怎么办\”。 因此,只有我们删除部门后,级联才会生效。通过将关系设置为空集,我们要做的就是将员工与部门分开,而不是删除员工。而且,如果该关系对于员工没有设置为可选,则在保存时将导致错误。如果要从部门中删除员工,则可以按上面列出的步骤对其进行遍历,或者将部门关系设置为级联,然后删除该部门。     ,        我也有类似下面的内容,但是没有用...
- (BOOL)deleteCollection:(Collection *)collection {
    // Grab the context
    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error = nil;

    [collection removeSounds:collection.sounds];
    [context deleteObject:collection];

    // Save everything
    if ([context save:&error]) {
        return YES;
    }
    return NO;
}
显然,数据库层无法一次删除声音,然后立即删除集合。将关系的删除规则设置为\'cascade \'很好地解决了我的问题,让我只使用:
[context deleteObject:collection];
如果您想节省一些人的详细阅读时间,只需将其标记为答案即可。 正如Fervus上文所述,此链接可能也对专业人士有所帮助: 在核心数据中立即传播删除     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?