我们应用程序中的数据库由嵌套数层的对象组成。出于架构上的原因,我们现在要迁移到这里是不可行的。
每天都有很大一部分数据过期。随着数据库大小的增长,我们的应用程序性能会下降。
因此,我们需要找到一种有效的方法来保持数据库的小型化(至少在这个版本中),我们正在考虑以下方法之一:
在 applicationWillResignActive 期间,通过遍历根级别的所有对象来删除 NSManagedObjects,对每个对象调用 delete,然后允许删除级联到 3 层“对多”对象。这涉及到最后保存的一个上下文,它将所有这些都提交给数据库。这通常需要 10-20 秒(在 iPhone 4 上)才能删除对象,而 Springboard 在 10 秒时终止该过程。这样做的一个主要缺点是,如果在 10 秒超时之前未完成上下文保存,则不会删除任何内容,并且每次用户运行应用程序时数据库都会继续增长。
删除 didFinishLaunchingWithOptions 或 applicationDidBecomeActive 或 applicationWillResignActive 内的整个 sqlite 文件。这迫使我们弹出应用程序的视图控制器堆栈的根目录,以避免尝试显示已删除的数据。最大的缺点是应用程序必须下载并解析数据几秒钟,然后用户下次启动应用程序时才能执行任何操作。
在用户点击 Home 或 Power 按钮后,使用 beginBackgroundTaskWithExpirationHandler 删除 DB 对象。与此相关的未知数使它变得可怕。有人这样做(成功)吗?
在应用程序运行时逐步删除较小的对象组。这会增加设备上的负载,以至于破坏了 tableview 的平滑度,使它们变得紧张。与删除旧对象并发的 API 调用已经解析的数据量在这里似乎不切实际。
任何关于在 Core Data 中删除对象的最佳实践的想法都将不胜感激!