我有报告称用户在通过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";
由于我们正在记录的内容以及我们如何管理日志文件存在一些缺点,因此我不确切地知道在打开持久性存储的过程中何时发生这种情况.我们正在使用UIManagedDocument
但不通过iCloud共享任何文档.我假设在打开现有文档包时发生错误,但即便如此.(因此,我对未来版本的日志记录进行了改进.)
我最接近再现错误的是persistentStore-shm
在iOS模拟器应用程序安装的文档包中使用文件权限0444 ,然后SELECT
使用sqlite3
命令行界面尝试该语句.在这种情况下的错误SQLITE_CANTOPEN
不是SQLITE_READONLY
,所以我可能没有关于文件权限的理论.据我所知,UIManagedDocument
无论如何都会自动修复文件权限.
我想知道的是,是否有人经历过类似的行为?如果是这样,有没有办法恢复,以便用户不必经历重新创建本地数据存储的过程?