0

我在 Core Data 中的两个实体(EntityA 和 EntityB)之间存在多对多关系,并且我试图通过删除与 EntityA 的任何实例不再有任何关系的 EntityB 实例来定期清理数据库。我正在使用Mogenerator创建 .m 和 .h 文件,这允许我以我的方式引用属性/关系名称。

NSPredicate *noRelationPredicate = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionWithFormat:@"%K", EntityBRelationships.relationshipNameForEntityA] rightExpression:[NSExpression expressionWithFormat:@"nil"] modifier:NSDirectPredicateModifier type:NSEqualToPredicateOperatorType options:0];

但是,我在执行 fetch 时遇到以下错误:'NSInvalidArgumentException',原因:'to-many key not allowed here'

我更喜欢使用类方法NSComparisonPredicate predicateWithLeftExpression:rightExpression:modifier:type:options:创建谓词,因为我尽量避免在谓词创建中使用字符串文字。

4

2 回答 2

1

您可以向实体 B 添加一个类别,以检查它是否可以被删除。

-(void)willSave {
    if (!self.aRelations.count && !self.isDeleted) {
        [self.managedObjectContext deleteObject:self];
    }
}

(通过在单独的文件中使用类别,如果您想重新生成托管对象子类,则不会覆盖此代码。)

于 2013-09-15T07:54:08.223 回答
0

在定义关系时,可以指定 CoreData 应该对“孤立”实例做什么。请参阅此处的“关系删除规则”:https ://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1

特别是,您可以使用“级联”为您处理删除。从文档中:

级联

删除关系目标处的对象。例如,如果您删除一个部门,请同时解雇该部门的所有员工。

于 2013-09-15T03:00:46.293 回答