iOS 7中的核心数据迁移

时间:2014-05-04 19:31:25

标签: xcode core-data ios7 core-data-migration

最后让这次迁移工作,这是一个巨大的痛苦。

source code

在iOS6中,一切正常,但在iOS7应用程序崩溃

1 个答案:

答案 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>";
}

同样基于该报告以及您的源代码:您几乎肯定会在迁移后遗留旧的walshm文件,这会导致迁移后出现问题。从iOS 7开始,Core Data使用WAL模式日记功能。这意味着复制或删除持久存储时需要担心几个额外的文件。如果您的商店文件名为foo.sqlite,则同一目录中还有foo.sqlite-walfoo.sqlite-shm

您的代码会删除旧的SQLite文件并将其替换为新的SQLite文件,但会保留现有的日记文件。这会导致数据不一致,因为日志文件不再与主SQLite文件相对应。 SQLite和Core Data无法理解剩下的内容,因此应用程序崩溃了。

解决方案最有可能确保清理额外的文件。当你打这个电话时:

success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];

...还删除了两个额外的文件。

对于将来的工作,将持久性存储文件放在其自己的目录中而没有其他文件是有用的。然后,如果您需要删除商店,只需一步即可删除该目录,而无需关心SQLite或Core Data可能创建的其他额外文件。