核心数据:如何删除和重build数据存储?

我在iOS 7+应用程序中使用Core Data ,不需要保存用户数据,应用程序需要的所有数据都被请求服务,随时可以恢复。 所以,如果我在下一次应用程序更新中更改我的数据模型,那么在删除所有以前的数据并再次请求这些数据方面没有任何问题。 但是我不知道如何简单地用新的数据模型来取代之前的数据模型,而没有执行迁移,因为看起来我不需要这样做…

提前致谢

案例1:您正在使用SQLite商店

这适用于您的商店types是NSSQLiteStoreType 。 即使您打算不时删除数据,坚持使用SQLite也不失为一个好主意,因为它可以让您随时随地将caching的数据保存在磁盘上,并且只在您更改时才将其删除模型,你不想应用任何迁移。

快速解决? 在初始化Core Data时,在启动时删除NSPersistentStoreCoordinator的存储。 例如,如果您使用Apple的样板代码提供的默认SQLite存储:

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"cd.sqlite"] 

你可以简单地删除文件:

 [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; 

然后storeURL使用storeURL添加一个新的持久化存储。
你的NSPersistentStoreCoordinator不会抱怨,如果你有一个新的模型,你不需要任何的迁移,但是当然你的数据将会丢失。

毫无疑问,当您检测到数据模型中的更改时,您可以决定使用此解决scheme,如果没有更改,则将存储单独放置,以便只要需要,就可以保留caching的数据。

更新:

正如TomHerrington在评论中所build议的那样 ,为了确保您已经完全移除了旧的商店,您还应该删除日记文件,如果您不照顾他们,日记文件可能会在未来出现并且困扰您。
如果您的存储文件被命名为cd.sqlite (如示例中所示), cd.sqlite-shm删除的其他文件是cd.sqlite-shmcd.sqlite-wal

核心数据的WAL日志logging模式作为苹果在QA1809中报告的iOS 7和OSX Mavericks中的默认引入。

情况2:使用内存中的商店

如上所示,您可以使用NSInMemoryStoreType而不是NSSQLiteStoreType切换到内存存储。 在这种情况下擦除存储是非常容易的:所有的数据驻留在内存中,当应用程序停止运行时,所有的数据都将消失,磁盘上的任何内容都不会保留。 下一次,您可能会加载完全不同的模型,而不进行任何迁移,因为没有要迁移的数据。
然而,这个实现的解决scheme不会让你在会话之间caching数据,这看起来像你想在应用程序更新之间做的事情(例如,只有当应用程序更新和模型改变,否则将其保存在磁盘上可能是有用的)。

注意:

两种方法都是可行的,有其优点和缺点,我相信也可以有其他策略。 最后,你应该有所有的元素来决定在你的具体情况下最好的方法是什么。