我有报告称用户在通过App Store更新后无法使用iOS应用程序,因为Core Data使用的SQLite数据库显然已成为只读状态.这发生在读/写持久性存储中,该存储保存在Documents应用程序包的文件夹中.
持久存储是在第一次登录应用程序时为每个用户从头开始创建的.其内容通过自定义渐进式管理对象模型迁移进行维护.实际上,在最近的版本中没有迁移执行,因此应用程序启动后,持久存储应该准备好打开.
我们从用户收到的错误是相同的,它在升级完成后的流程启动早期发生.在userInfo该的NSError对象是什么,我们在这种情况下拍摄的:
NSSQLiteErrorDomain = 264;
NSUnderlyingException = "error during prepareSQL for SQL string 'SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA' : attempt to write a readonly database";
Run Code Online (Sandbox Code Playgroud)
由于我们正在记录的内容以及我们如何管理日志文件存在一些缺点,因此我不确切地知道在打开持久性存储的过程中何时发生这种情况.我们正在使用UIManagedDocument但不通过iCloud共享任何文档.我假设在打开现有文档包时发生错误,但即便如此.(因此,我对未来版本的日志记录进行了改进.)
我最接近再现错误的是persistentStore-shm在iOS模拟器应用程序安装的文档包中使用文件权限0444 ,然后SELECT使用sqlite3命令行界面尝试该语句.在这种情况下的错误SQLITE_CANTOPEN不是SQLITE_READONLY,所以我可能没有关于文件权限的理论.据我所知,UIManagedDocument无论如何都会自动修复文件权限.
我想知道的是,是否有人经历过类似的行为?如果是这样,有没有办法恢复,以便用户不必经历重新创建本地数据存储的过程?
将您自己的描述符添加到选项以(重新)启用历史跟踪...
在作为容器设置的一部分加载商店之前执行此操作:
let container = NSPersistentContainer(name: "YourDataStoreIdentifier" )
let description = container.persistentStoreDescriptions.first
// This allows a 'non-iCloud' sycning
// container to keep track of changes
// as if it was an iCloud syncing container
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
container.loadPersistentStores(...
Run Code Online (Sandbox Code Playgroud)
小智 2
我遇到了这个,这很令人费解。结果发现 -shm 文件(预写日志的索引)已被清除,需要重建。当将持久存储加载到NSPersistentStoreCoordinator.
如果您+[NSPersistentStore metadataForPersistentStoreWithURL:error:]在执行此操作(我正在执行此操作)之前调用,您将收到报告的错误,并且返回值将为nil.
因此,对我有用的解决方案是尝试检索元数据,如果因错误而失败,则将持久存储加载到NSPersistentStoreCoordinator重建 -shm 中。完成此操作后,调用metadataForPersistentStoreWithURL:error:将返回元数据,而不会遇到只读错误。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |