我有一个问题NSBatchDeleteRequest
似乎是不可能删除关系引用。
我有两个实体:
- 新闻
- 类别
其中一个类别可以具有多个新闻。
现在,当我尝试使用NSBatchDeleteRequest
和下面的代码删除核心数据中的所有对象时,查看sqlite文件似乎所有类别都被删除了,所有新闻都被删除了,但类别和新闻之间的关系仍然存在,这导致了错误。
这里的删除功能:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
[delete setResultType:NSBatchDeleteResultTypeCount];
NSError *error;
NSBatchDeleteResult *results = [deleteContext executeRequest:delete error:&error];
有什么办法解决吗?
3条答案
按热度按时间bvjxkvbb1#
你可以用
[manageObjectContext reset];
hjqgdpho2#
将
shouldDeleteInaccessibleFaults:
设置为YES
,不可访问/不可实现的故障将被删除,这解决了当前的问题。WWDC 2015大会What 's New in Core Data讨论了这一点。
NSBatchDeleteRequest
和NSBatchUpdateRequest
都在没有NSManagedObjectContext
参与的情况下修改持久存储-这将导致上下文的数据视图与存储不一致。需要在
NSManagedObjectContext
中更新已删除对象的内存副本-让批删除请求返回已删除对象的对象ID,并通知NSManagedObjectContext
刷新这些ID。这看起来像这样:
运行批量删除时,关系将被删除或取消,但可能不会执行一组级联删除规则,也不会执行验证规则-使用任何批量更改请求时,由应用程序来确保数据完整性。
您的数据模型可能要求您发出多个删除请求,以防止相关对象成为孤立对象但仍然可以找到。例如,您可能需要第二次批量删除,以查找以前相关但现在关系为空的实体。此类请求的 predicate 可能如下所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"toMany.@count == 0"];
或者可以使用子查询等。
lhcgjxsq3#
我认为最好的解决方案是首先删除对象图中的类别,从而使所有关系无效。
之后,您可以继续为新闻项使用
NSBatchDeleteRequest
。请记住,批处理请求将跳过对象图的所有完整性检查。