我的iPhone应用程序的少数客户正在遭遇核心数据存储损坏(我假设是这样,因为错误是“无法保存到数据存储:操作无法完成。(可可错误259。)”)
有没有其他人经历过这种商店腐败?我很担心,因为我的目标是尽快推出执行架构迁移的更新,我担心这会暴露更多问题。
我曾假设Core Data / SQLlite API使用原子操作并且不受腐败影响,除非底层文件系统出现损坏。
有没有办法减少/防止腐败,以及重现腐败的方法,所以我可以测试一下(到目前为止我没有成功)。
同样出现此错误:“/var/mobile/Applications//Documents/foo.sqlite中的数据库已损坏.SQLite错误代码11,数据库磁盘映像格式错误。”
答案 0 :(得分:20)
当我手动覆盖Base.sqlite
而不删除Base.sqlite-wal
和Base.sqlite-shm
时,我发生了这种情况。实际上,these files are new SQLite 3.7 features可能会在iOS 7中添加。
要解决此问题,我删除了Base.sqlite-*
,sqlite从我的新基本版本重新生成了它们。
答案 1 :(得分:2)
您获得的错误在Foundation.h中定义
NSFileReadCorruptFileError = 259,//读取错误(文件损坏,格式错误等)
我从来没有遇到过真正的商店,但我遇到了类似的错误权限(在Mac上)。我还没有看到有人在网上提到类似的错误。 Core Data中的错误预防系统非常强大。
我猜想创建这个的最简单方法是发送持久性存储来查看错误的文件,例如意外地将其定位在文本文件中。如果它需要一个SQL存储但发现别的东西,它会抱怨该文件已损坏。那只是在黑暗中拍摄的。
这很难追查,因为这样的错误在核心数据中是如此罕见,以至于没有任何工具可以帮助找到问题。
我建议:
答案 2 :(得分:2)
还尝试通过填充设备上的驱动器来复制错误 - 您应该收到磁盘已满错误而不是数据库损坏,但是可能以这种方式获取损坏的数据库。
答案 3 :(得分:2)
为清楚起见,使用Xcode 7.2.1,SQLite数据存储,核心数据对象图,用于原型应用程序。
我的问题由Xcode终端详细说明:
CoreData:错误:(11)致命错误。数据库在 / Users / etc / Library / Developer / CoreSimulator / Devices / etc / data / Containers / Data / Application / etc / Library / Application Support / com.etc.etc / etc.sqlite已损坏。 SQLite错误代码:11,'数据库磁盘映像格式错误'。
有效地,我的应用程序能够加载和读取SQLite数据,但无法保存。
SO用户This answer的 software evolved对我有意义。在使用模拟器时,我非常肯定我在私有队列并发类型为NSPrivateQueueConcurrencyType
的托管对象上下文中断了一个保存操作。
进一步调查(使用SQLiteManager)显示我当时保存的SQLite表是导致此问题的原因。
我可以轻松删除该应用程序(尚未公开发布)但是我想了解至少如何修复此问题。
这段经历的注释:
- (void)applicationWillResignActive:(UIApplication *)application
下的app委托中,如果您的托管对象上下文hasChanges
确保包含数据库保存方法; SQLite数据库文件修复方法:
cd
]; dbMalFormedBU.sqlite
)(如果修复成功,可以在以后删除)[cp
]; dbMalFormed.sqlite-shm
和dbMalFormed.sqlite-wal
个文件[rm
]; sqlite3 dbMalFormed.sqlite
]; .clone dbMalFormedNew.sqlite
]; .exit
]; rm dbMalFormed.sqlite
); mv dbMalFormedNew.sqlite dbMalFormed.sqlite
]。答案 4 :(得分:1)
您是否曾使用sqlite API与数据库进行交互?或者您是否使用过任何非Apple工具来创建种子数据库?
答案 5 :(得分:1)
我经历过"核心数据存储损坏"当我用一个独立的线程(不是主线程)预加载数据库时,很难找到这个bug,因为只有少数客户会因此而崩溃他们的应用程序。
答案 6 :(得分:1)
我在尝试获取持久性商店协调员时遇到了这个错误。
多线程是我的问题。修复了使用<div class="row">
<div class="input-field col s12">
<input id="speciality" type="text" class="validate">
<label for="speciality">Speciality</label>
</div>
</div>
<div class="row">
<button class="btn waves-effect waves-light" type="submit" name="action">Search
<i class="material-icons right">search</i>
</button>
</div>
块包装整个方法的问题。
@synchronized(self) {}
答案 7 :(得分:0)
我最近遇到过这个问题。在我的例子中,我正在执行搜索并迭代对象以将数据转换为XML和KML。然后我会生成电子邮件处理程序并附加文件。然后我会更新对象中的一个字段,最后保存到后备存储(SQL Lite)。工作正常3.x.在4.x它打破了。
在更改和保存数据库之前完成所有电子邮件处理对我来说是愚蠢的。将所有非必要代码移动到保存后的点清除了此问题。
此问题会彻底破坏SQL DB。在我的情况下,错误是:
File at path does not appear to be a SQLite database