答案 0 :(得分:3)
根据您在http://openradar.io/15555487的评论和错误报告,我猜测完整的消息是这样的:
CoreData: error: failure reading metadata plist with data bytes: <33>
Unable to open database. Error: The file couldn’t be opened because it isn’t in the correct format.
Info: {
NSUnderlyingException = "An error <null> occurred converting the metadata plist data: <33>";
}
同样基于该报告以及您的源代码:您几乎肯定会在迁移后遗留旧的wal
和shm
文件,这会导致迁移后出现问题。从iOS 7开始,Core Data使用WAL模式日记功能。这意味着复制或删除持久存储时需要担心几个额外的文件。如果您的商店文件名为foo.sqlite
,则同一目录中还有foo.sqlite-wal
和foo.sqlite-shm
。
您的代码会删除旧的SQLite文件并将其替换为新的SQLite文件,但会保留现有的日记文件。这会导致数据不一致,因为日志文件不再与主SQLite文件相对应。 SQLite和Core Data无法理解剩下的内容,因此应用程序崩溃了。
解决方案最有可能确保清理额外的文件。当你打这个电话时:
success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];
...还删除了两个额外的文件。
对于将来的工作,将持久性存储文件放在其自己的目录中而没有其他文件是有用的。然后,如果您需要删除商店,只需一步即可删除该目录,而无需关心SQLite或Core Data可能创建的其他额外文件。