核心数据存储损坏

时间:2010-04-30 01:12:28

标签: iphone sqlite core-data

我的iPhone应用程序的少数客户正在遭遇核心数据存储损坏(我假设是这样,因为错误是“无法保存到数据存储:操作无法完成。(可可错误259。)”)

有没有其他人经历过这种商店腐败?我很担心,因为我的目标是尽快推出执行架构迁移的更新,我担心这会暴露更多问题。

我曾假设Core Data / SQLlite API使用原子操作并且不受腐败影响,除非底层文件系统出现损坏。

有没有办法减少/防止腐败,以及重现腐败的方法,所以我可以测试一下(到目前为止我没有成功)。

编辑:

同样出现此错误:“/var/mobile/Applications//Documents/foo.sqlite中的数据库已损坏.SQLite错误代码11,数据库磁盘映像格式错误。”

8 个答案:

答案 0 :(得分:20)

当我手动覆盖Base.sqlite而不删除Base.sqlite-walBase.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存储但发现别的东西,它会抱怨该文件已损坏。那只是在黑暗中拍摄的。

修改

这很难追查,因为这样的错误在核心数据中是如此罕见,以至于没有任何工具可以帮助找到问题。

我建议:

  1. 检查错误来自代码的上游。也许有些东西会把商店扔掉或导致它在另一个地方看。
  2. 检查您可能在哪里做非标准的事情。例如,如果您在代码中生成自己的实体映射,如果您不小心,很容易将其丢弃。

答案 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表是导致此问题的原因。

我可以轻松删除该应用程序(尚未公开发布)但是我想了解至少如何修复此问题。

这段经历的注释:

  • 在UIApplicationDelegate Protocol - (void)applicationWillResignActive:(UIApplication *)application下的app委托中,如果您的托管对象上下文hasChanges确保包含数据库保存方法;
  • 如果使用多个队列,请在单击Xco​​de中的停止按钮之前使用Home按钮触发第1项中的委托方法;
  • 修复损坏的数据库文件 - 我从本网页Fixing the SQLite error “The database disk image is malformed”上列出的答案开发了以下详细解决方案。

SQLite数据库文件修复方法:

  1. 打开终端[terminal / sqlite commands];
  2. 导航到相应的文件位置[cd];
  3. 出于备份目的,复制“格式错误”的数据库文件(例如dbMalFormedBU.sqlite)(如果修复成功,可以在以后删除)[cp];
  4. 要确定,请删除dbMalFormed.sqlite-shmdbMalFormed.sqlite-wal个文件[rm];
  5. 打开'格式错误'的数据库文件[sqlite3 dbMalFormed.sqlite];
  6. 克隆数据库文件[.clone dbMalFormedNew.sqlite];
  7. 退出SQLite3 [.exit];
  8. 删除旧的'格式错误的'数据库文件[rm dbMalFormed.sqlite);
  9. 将新数据库文件重命名为以前使用的名称[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
相关问题