我有一个对象 Car.h。Car.h 有 carparts.h(NSSet 到关系)。
我需要删除 NSSet 中属于 car.h 对象的部分之一。
我该怎么做呢?
如果car.mySet
是你的套装,你可以试试,
NSMutableSet *mutableSet = [car.mySet mutableCopy];
[mutableSet removeObject:carpartsObject];
car.mySet = [mutableSet copy];
我假设这Car
是一个子类,NSManagedObject
因为你有 core-data 标签。
Core Data 符合 KVO。
在此处参考
动态生成的访问器方法
默认情况下,Core Data 为托管对象类的建模属性(属性和关系)动态创建高效的公共和原始 get 和 set 访问器方法。这包括键值编码可变代理方法,例如add<Key>Object:
和删除:,如 mutableSetValueForKey 的文档中所述:-托管对象实际上是其所有对多关系的可变代理。
此处有关 KVO 命名约定的 其他参考
为了成为键值编码投诉,mutable unordered to-many relationship
您必须实现以下方法:
-add<Key>Object: or -add<Key>:
. 必须至少实施其中一种方法。这些类似于 NSMutableSet 方法 addObject:。
-remove<Key>Object: or -remove<Key>:
. 必须至少实施其中一种方法。这些类似于 NSMutableSet 方法 removeObject:。
-intersect<Key>:
. 选修的。如果基准测试表明性能是一个问题,则实施。它执行 NSSet 方法 intersectSet: 的等效操作。
如果您想确保也从对象存储中删除一对多对象(默认操作是使父实体无效),您可以覆盖以下自动生成的方法之一Car
:
- (void)removeCarpartsObject:(Carpart *)value
{
NSMutableSet *set = [self mutableOrderedSetValueForKey:NSStringFromSelector(@selector(carparts))];
[set removeObject:value];
[self.managedObjectContext deleteObject:value];
}
下面是另一种从核心数据中删除 NSSet 中对象的替代方法。我自己尝试过这种方法,它也有效。
- (void)removeCarpartsObject:(Carpart *)value
{
NSError *error;
NSInteger index = [car.mySet.allObjects indexOfObject:carpartsObject];
[self.managedObjectContext deleteObject:car.mySet.allObjects[index]];
[self.managedObjectContext save:&error];
}