Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何以某种通用方式删除有序到多个CoreData关系中的对象?_Ios_Objective C_Core Data - Fatal编程技术网

Ios 如何以某种通用方式删除有序到多个CoreData关系中的对象?

Ios 如何以某种通用方式删除有序到多个CoreData关系中的对象?,ios,objective-c,core-data,Ios,Objective C,Core Data,我有一个联系实体,与另一个实体有一对多的关系,包括电子邮件地址、电话 这种关系(自然称为“电子邮件、电话”)也是有序的,因此我可以在表视图中显示联系人的电子邮件地址列表,并允许用户删除或修改每个地址。据我所知,需要对它们进行排序,以便我可以知道哪个正在被删除/修改:例如,如果用户点击第1行中的“删除”按钮,则第二个电子邮件地址应该从关系中删除。如果没有命令,我不知道该移走哪一个 生成NSManagedObject子类时,我在类上获得了一个SensorDeredSet属性,CoreData在.h文

我有一个联系实体,与另一个实体有一对多的关系,包括电子邮件地址、电话

这种关系(自然称为“电子邮件、电话”)也是有序的,因此我可以在表视图中显示联系人的电子邮件地址列表,并允许用户删除或修改每个地址。据我所知,需要对它们进行排序,以便我可以知道哪个正在被删除/修改:例如,如果用户点击第1行中的“删除”按钮,则第二个电子邮件地址应该从关系中删除。如果没有命令,我不知道该移走哪一个

生成NSManagedObject子类时,我在类上获得了一个SensorDeredSet属性,CoreData在.h文件中提供了一些访问器:

@interface Contact (CoreDataGeneratedAccessors)
- (void)insertObject:(PLEmail *)value inEmailsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromEmailsAtIndex:(NSUInteger)idx;
- (void)insertEmails:(NSArray<PLEmail *> *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeEmailsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInEmailsAtIndex:(NSUInteger)idx withObject:(PLEmail *)value;
- (void)replaceEmailsAtIndexes:(NSIndexSet *)indexes withEmails:(NSArray<PLEmail *> *)values;
- (void)addEmailsObject:(PLEmail *)value;
- (void)removeEmailsObject:(PLEmail *)value;
- (void)addEmails:(NSOrderedSet<PLEmail *> *)values;
- (void)removeEmails:(NSOrderedSet<PLEmail *> *)values;

- (void)insertObject:(PLTelephone *)value inTelephonesAtIndex:(NSUInteger)idx;
- (void)removeObjectFromTelephonesAtIndex:(NSUInteger)idx;
- (void)insertTelephones:(NSArray<PLTelephone *> *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeTelephonesAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInTelephonesAtIndex:(NSUInteger)idx withObject:(PLTelephone *)value;
- (void)replaceTelephonesAtIndexes:(NSIndexSet *)indexes withTelephones:(NSArray<PLTelephone *> *)values;
- (void)addTelephonesObject:(PLTelephone *)value;
- (void)removeTelephonesObject:(PLTelephone *)value;
- (void)addTelephones:(NSOrderedSet<PLTelephone *> *)values;
- (void)removeTelephones:(NSOrderedSet<PLTelephone *> *)values;
@end

如果您有互惠关系(推荐),您可以在电子邮件或电话实体上取消联系关系。这也将从联系人列表中删除该实体

处理多个关系的示例代码

- (void)removeRelationship:(NSString *)relationshipKeyPath fromEntity:(NSManagedObject *)entity {
    [entity setValue:nil forKeyPath:relationshipKeyPath];
}
您可以这样使用它:

[self removeRelationship:@"contact" fromEntity:unknownRelationshipForContact];

您不需要订购模型。相反,只需对数据源进行排序。但这是另一个故事。如果MR_deleteEntity删除了对象,并且删除规则为nullify,则该对象将自动从联系人中删除。删除规则为nullify,但它只是使对象为零,而不是删除。对象在有序集中可以为零吗?@Willeke没有对象在有序集中不能为零。的相互关系“电子邮件或电话”实体与许多其他实体以及“建筑物或财产等”实体一样“实体。在这种情况下,我如何才能从联系人、建筑、财产等实体中找到我必须发送的电子邮件为零?我认为你不知道任何上下文都无法逃脱。你必须知道你要切断的是哪种关系。最初的问题没有说明双方都涉及多个关系。但是,您可以使用一个通用的
removeContact:
方法,它不关心接收者是
电子邮件还是
电话
实体。然后对
removeBuilding:
等执行相同的操作。同样,将检查building或contact,顺便说一句,它不是通用的。实际上,您可以通过传递要断开的关系的键路径使其更通用。然后可以使用
NSManagedObject
的基本方法来处理它。然而,这使得代码很脆弱,仍然需要一些上下文。
[self removeRelationship:@"contact" fromEntity:unknownRelationshipForContact];