【发布时间】:2014-09-01 12:07:39
【问题描述】:
我需要找到现有持久存储中使用的模型版本,以便在自动轻量级迁移后进行一些后期处理。
我们的一些设备处于无法获取其持久性存储的元数据的状态。
当我们初始化 CoreData 堆栈时,我们使用 NSPersistentStoreCoordinator 的 +metadataForPersistentStoreOfType:URL:error: 方法来获取现有持久存储的元数据。然后我们检查它的元数据是否与当前对象模型中的元数据兼容,以决定是否需要进行迁移。我们还从这两组元数据中拉取模型版本——所以在自动轻量级迁移之后,我们可以根据模型版本做一些简单的后处理。
问题是 +metadataForPersistentStoreOfType:URL:error: 在某些设备上失败并返回 nil。该错误指示 NSSQLiteErrorDomain 14 和“数据库的 I/O 错误”。如果我打开 SQLite 调试(“-com.apple.CoreData.SQLDebug 1”),它不会产生太多有用的信息:
CoreData: annotation: Connecting to sqlite database file at "/var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore"
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: annotation: Disconnecting from sqlite database due to an error.
CoreData: error: (14) I/O error for database at /var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore. SQLite error code:14, 'unable to open database file'
CoreData: annotation: Disconnecting from sqlite database.
metadataForPersistentStoreOfType failed with error: The operation couldn’t be completed. (Cocoa error 256.) (userInfo: {
NSSQLiteErrorDomain = 14;
NSUnderlyingException = "I/O error for database at /var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore. SQLite error code:14, 'unable to open database file'";
})
我确实在 Apple 的网站上找到了这篇文章,它暗示了问题的潜在来源:https://developer.apple.com/library/ios/qa/qa1809/_index.html 但它似乎对我的问题没有帮助。 (它描述了一种迁移持久存储和更改日志选项的方法......但它假设我已经有一个 NSPersistentStore 实例,但我没有。我可以通过 PSC 添加它......但这需要迁移它,这违背了整个目的 - 再次,因为我试图在迁移之前找到现有商店的版本。)
这里的一个潜在复杂情况是,我正试图从 UIManagedDocument 存储切换到传统的 CoreData 堆栈(我们正在放弃 UIManagedDocument,因为一连串的问题永无止境,而且我们更了解标准 CoreData 堆栈) .在实践中,这似乎不是问题(直到现在?),但我认为这可能值得一提。
编辑:这是在运行 iOS 7.1.1 的 iPad(第三代)上。
【问题讨论】:
-
您确定错误消息中的 URL 吗? SQLite 文件实际上是否命名为
persistentStore而不是persistentStore.sqlite? -
是的。这最初是通过 UIManagedDocument 创建的,这似乎是它命名商店的方式。