删除在X天之后的核心数据

4 浏览
0 Comments

删除在X天之后的核心数据

我在Core Data中有一堆对象,希望它们在X天后自动删除(基于NSDate)。我搜索了一下,似乎只能一次删除一个核心数据对象,而不是一组对象,更不用说基于特定日期的对象了。我考虑可能要运行一个循环来遍历每个对象,但这似乎会消耗很多处理器资源。有任何建议我应该去哪里做这个?谢谢。

0
0 Comments

问题的原因是在Core Data中删除对象非常消耗处理器资源。解决方法是使用后台NSOperationQueue执行大型操作,以便在删除对象时不会锁定主应用程序。应在每个线程上使用单独的托管对象上下文,并共享持久性存储协调器。在后台线程中创建一个新的上下文,使用循环删除所有对象,然后在主线程上保存后台线程上下文。如果发生冲突,则可以选择中止整个删除操作并重新开始。可以通过使用FCModel作为轻量级替代品来解决处理器资源问题。然而,迁移数据从Core Data到FCModel并不容易。在iOS 8中引入的Core Data批量更新可能是一个好的解决方案。

0
0 Comments

问题的原因是Core Data在删除大量对象时效率较低,需要逐个遍历对象进行删除操作。解决方法是通过添加一个自定义的布尔属性来标记待删除的对象,然后在方便的时候进行实际的删除操作。

具体解决方法如下:

1. 给实体类型添加一个自定义的布尔属性,比如称为"toBeDeleted",默认值为"NO"。

2. 当有一批对象需要删除时,使用"NSBatchUpdateRequest"(iOS 8中新增的类)来一次性将它们的"toBeDeleted"属性设置为"YES"。这个类的文档相对较少,可以查看头文件或者参考BNR博客的相关文章。通过指定属性名和新的属性值,Core Data将会进行批量快速的更新操作。

3. 确保所有的抓取请求都检查"toBeDeleted"属性是否为"NO"。这样即使标记为删除的对象仍然存在,它们在抓取时也会被排除在外。

4. 在某个时机(稍后,但不要太晚),在后台运行一些代码,用来抓取并删除"toBeDeleted"属性为"YES"的对象。

通过上述方法,我们可以在避免应用程序不必要的延迟的同时,进行高效的对象删除操作。

0
0 Comments

问题出现的原因是,有些开发者想要在一定时间后删除Core Data中的数据。解决方法是使用NSPredicate来检查数据的创建日期是否早于指定日期,如果是则删除数据。

以下是解决方法的代码示例:

- (void)deleteAllObjects

{

NSArray *allEntities = self.managedObjectModel.entities;

for (NSEntityDescription *entityDescription in allEntities)

{

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

[fetchRequest setEntity:entityDescription];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"creationDate < %@", [NSDate dateWithTimeIntervalSinceNow:(- MINUTESFROMNOW )]]];

fetchRequest.includesPropertyValues = NO;

fetchRequest.includesSubentities = NO;

NSError *error;

NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (NSManagedObject *managedObject in items) {

[self.managedObjectContext deleteObject:managedObject];

}

if (![self.managedObjectContext save:&error]) {

NSLog(@"Error occurred");

}

}

}

这段代码通过遍历所有实体,使用NSPredicate来筛选出创建日期早于指定日期的数据,然后将其删除。注意,在设置实体后,我们添加了一行代码来设置NSPredicate。

通过这种方式,开发者可以在一定时间后删除Core Data中的数据。

0