案例 1:您使用的是 SQLite 商店
这适用于您的商店类型为 NSSQLiteStoreType。即使您打算不时删除数据,坚持使用 SQLite 也不是一个坏主意,因为它使您可以灵活地将缓存数据保留在磁盘上,只要您愿意,并且只有在您更改数据时才将其删除模型并且您不想应用任何迁移。
快速解决方案?在初始化 Core Data 时,在启动时删除 NSPersistentStoreCoordinator 的存储。
例如,如果您使用 Apple 的样板代码提供的默认 SQLite 存储:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"cd.sqlite"]
您可以简单地删除文件:
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
然后像往常一样使用storeURL 添加新的持久存储。
如果您有新模型并且不需要任何迁移,您的NSPersistentStoreCoordinator 不会抱怨,但您的数据当然会丢失。
不用说,当您检测到数据模型发生更改时,您可以决定使用此解决方案,如果没有更改,则不考虑存储,这样您就可以根据需要保留缓存数据。
更新:
根据 cmets 中 TomHerrington 的建议,为确保您已完全删除旧存储,您还应该删除日志文件,如果您将来可能会回来困扰您不要照顾他们。
如果您的商店文件名为cd.sqlite,如示例中所示,则要删除的附加文件为cd.sqlite-shm 和cd.sqlite-wal。
正如 Apple 在QA1809 中所报告的那样,Core Data 的 WAL 日志模式是 iOS 7 和 OSX Mavericks 中的默认设置。
案例 2:使用内存存储
按照建议,您可以切换到内存存储,使用 NSInMemoryStoreType 而不是 NSSQLiteStoreType。在这种情况下擦除存储要容易得多:您的所有数据都驻留在内存中,当您的应用程序停止运行时,所有数据都会消失,磁盘上不会留下任何内容供您清理。下次,您可能会加载一个完全不同的模型,而无需进行任何迁移,因为没有要迁移的数据。
但是,按原样实施的此解决方案不会让您在会话之间缓存数据,这看起来像是您希望在应用程序更新之间执行的操作(即,只有在更新应用程序和模型时才必须删除存储更改,而将其保存在磁盘上可能会很有用)。
注意:
这两种方法都是可行的,各有利弊,我相信也可能有其他策略。最后,您应该拥有所有要素来决定在您的特定情况下最佳方法是什么。