IOS核心数据删除无子女的父记录

时间:2013-09-01 21:15:33

标签: ios core-data parent purge

我为用户输入数据为中心的应用程序进行了“清除过程”。基本上有一个父实体和一个子实体。如果我“滑动删除”父对象,系统会正确删除子对象。这部分正在发挥作用。

现在,我要做的是通过删除所有旧的子对象?60?已被标记为“已对帐”的日子。将获取和删除请求放在一起应该没问题。我不知道的是如何获取和删除没有子对象的父对象(超过?60?天)?

我希望我不必迭代整个集合,获取子对象的计数并将该值保存到父级然后删除父级为“0”,但我想这将是我的计划B.数据结束如果用户保持在个人工作相关的收入之上,那么60天的时间可以产生60-100个新的父对象和150-300个新的子对象和子对象通常应该在创建的1-3周内被标记为“已对帐”项目及时。

父实体主要是字符串(大约20个属性),但是也有6个左右的BOOL和十进制属性,子节点大约有6个字符串,2个十进制和1个BOOL属性。因此,如果用户没有选择性地删除任何内容,我不确定在数据库大小方面将会转换为典型用法的一年。

我没有看到存档过程中的任何需要,因为这些信息从长远来看并不“严重”。但是,当时机成熟时,我不能指望我的目标受众手动“刷卡 - 删除”父对象,这意味着如果没有实施清除过程,数据集会随着时间的推移而变大。

是否有缩写响应提供Core Data将响应的一般方法或方法/ sql语法?或者我应该从不同的角度处理这个问题?提前谢谢。

3 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分:0)

您可能也对这个删除没有孩子的父母的一般解决方案感兴趣,因为您(或似乎是)同时删除它们:

iPhone Core Data: Cascading delete across a many-to-one relationship

但这可能不太明确。

我希望这个案例有删除规则。

答案 2 :(得分:0)

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)
}
相关问题