2

我正在为我的以用户输入数据为中心的应用程序开发一个“清除过程”。本质上存在一个父实体和一个子实体。如果我“滑动删除”父对象,系统会正确删除子对象。所以那部分正在工作。

现在,我要做的是检查并删除所有大于 60 岁的子对象?已标记为“已核对”的日期。将获取和删除请求放在一起应该没有问题。我不知道如何获取和删除没有子对象的父对象(早于?60?天)?

我希望我不必遍历整个集合,获取子对象的计数并将该值保存给父对象,然后用“0”删除父对象,但我想这将是我的计划 B。超过 60 天的数据期间可能会累积 60-100 个新父对象和 150-300 个新子对象,并且如果用户在其个人工作相关收入项目的顶部保持在一个及时的方式。

父实体大多是字符串(大约20个属性),但也有6个左右的BOOL和十进制属性,子实体大约有6个字符串、2个十进制和1个BOOL属性。所以我不确定如果用户没有选择性地删除任何内容,那么在一年的典型使用中,这将转化为数据库大小。

我没有看到归档过程中有任何需要,因为从长远来看,这些信息并不是“关键”的。但是,我不能指望我的目标受众在适当的时候习惯性地手动“滑动删除”父对象,这意味着如果不实施清除过程,数据集将随着时间的推移而变大。

是否有简短的响应来提供 Core Data 将响应的通用方法或方法/sql 语法?还是我应该从不同的角度来解决这个问题?提前致谢。

4

3 回答 3

1

删除子记录后,您可以执行查询以检索具有给定条件的父记录,并遍历每个返回的父记录并将其删除。以下是获取请求的样子:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"ParentEntity"];
request.predicate = [NSPredicate predicateWithFormat:@"date < %@ AND children.@count == 0", olderThan60Days];
request.includesPropertyValues = NO; // don't really care about these since it's for deletion

NSError *error;
NSArray *recordsToDelete = [context executeFetchRequest:request error:&error];

执行获取请求,将每个返回的对象一个一个删除。

于 2013-09-04T06:04:10.477 回答
1

Swift 4,> 带有 NSBatchDeleteRequest 的 iOS 9.0。也希望有一个删除规则。

class func deleteParent(entity: String, withNoChildren children: String, inContext context: NSManagedObjectContext) throws {

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    let predicate = NSPredicate(format: "\(children).@count == 0")
    request.predicate = predicate

    let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)

    try context.execute(deleteRequest)
}
于 2018-08-22T11:37:28.377 回答
0

您可能还对删除没有孩子的父母的通用解决方案感兴趣,因为您正在(或似乎正在)同时删除他们:

iPhone Core Data:跨多对一关系的级联删除

不过,这可能不太明确。

我希望这种情况有一个删除规则。

于 2014-02-28T00:02:22.767 回答