Core Data加载持久化存储报错问题
Core Data加载持久化存储报错问题

Core Data加载持久化存储报错问题

问题描述

当我修改Core Data的实体字段属性(将部分可选字段改为必选字段)后,重新运行Xcode发现预览报错。

Xcode在日志中输出如下报错:

CrashReportError: Fatal Error in CoreDataPersistenceController.swift
    
ERdepot crashed due to fatalError in CoreDataPersistenceController.swift at line 16.
    
Unable to load persistent stores: Error Domain=NSCocoaErrorDomain Code=134110 "永久性储存转移过程出错。" UserInfo={sourceURL=file:///Users/fangjunyu/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/DE733730-2C79-48CC-A1DF-6B32D409600A/data/Containers/Data/Application/A1EA6B69-4C9E-4B3A-829A-5EFD2467331C/Library/Application%20Support/ExchangeRateDataModel.sqlite, reason=Cannot migrate store in-place: Validation error missing attribute values on mandatory destination attribute, destinationURL=file:///Users/fangjunyu/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/DE733730-2C79-48CC-A1DF-6B32D409600A/data/Containers/Data/Application/A1EA6B69-4C9E-4B3A-829A-5EFD2467331C/Library/Application%20Support/ExchangeRateDataModel.sqlite, NSUnderlyingError=0x600000cbf6f0 {Error Domain=NSCocoaErrorDomain Code=134110 "永久性储存转移过程出错。" UserInfo={entity=Eurofxrefhist, attribute=symbol, reason=Validation error missing attribute values on mandatory destination attribute}}}

经过分析了解到,错误信息表示Core Data 在加载持久化存储时遇到了问题。具体来说,错误 Cannot migrate store in-place: Validation error missing attribute values on mandatory destination attribute 表示 Core Data 尝试迁移数据库(或从存储加载数据)时,遇到了验证错误。错误的原因是某个必需的属性(在此情况下是 symbol 属性)缺失了值。

错误的具体含义

原因:错误发生在 Core Data 尝试迁移存储时,它试图将一个旧的存储模型与当前的数据模型进行迁移。但是,目标属性 symbol 是必需的(即它是一个 mandatory 属性),而在某些数据条目中没有为这个属性提供值。

涉及的属性:错误指出在 Eurofxrefhist 实体中,symbol 属性缺少值,而该属性是必需的。

问题发生的地方:报错发生在 Core Data 尝试加载或迁移 SQLite 存储文件时。

可能的解决方案

1、检查数据模型中的属性设置

打开 .xcdatamodeld 文件,确保 symbol 属性被正确标记为 “Optional” 或 “Required”。如果它是 “Required”(必需的),那么必须确保所有数据条目都有 symbol 属性的值。

如果发现 symbol 属性没有值,确保在插入数据时为该属性提供有效的值。

2、清理旧的存储数据

有时,尤其是在数据模型更新后,Core Data 可能无法正确迁移旧的数据库。如果正在开发过程中,且不介意丢失现有的测试数据,可以尝试删除应用的存储文件,然后重新运行应用。这将清空数据库并创建一个新的数据库:

在 Xcode 中,点击 Product > Scheme > Edit Scheme,然后选择 Run > Options 并勾选 “Allow Location Simulation”. 之后,尝试清空模拟器的应用数据,或者删除 Library/Application Support 中的数据库文件。

手动删除模拟器中的存储文件:在模拟器中,找到并删除 Library/Application Support/ExchangeRateDataModel.sqlite 文件。

查找路径,在错误日志中有一个sqlite文件路径:

/Users/fangjunyu/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/DE733730-2C79-48CC-A1DF-6B32D409600A/data/Containers/Data/Application/A1EA6B69-4C9E-4B3A-829A-5EFD2467331C/Library/Application%20Support/ExchangeRateDataModel.sqlite

我们需要将这个路径中的%20替换为空格:

/Users/fangjunyu/Library/Developer/Xcode/UserData/Previews/Simulator Devices/DE733730-2C79-48CC-A1DF-6B32D409600A/data/Containers/Data/Application/A1EA6B69-4C9E-4B3A-829A-5EFD2467331C/Library/Application Support/ExchangeRateDataModel.sqlite

替换完成后,在访达中,按Command + Shift + G打开文件夹,将替换后的地址复制进去。

然后把 ExchangeRateDataModel.sqlite 文件移到桌面备份。

清除 Xcode 缓存并重新编译。

Xcode会重新生成数据库文件。

3、数据迁移

如果对数据库进行了模式更新(例如,将 symbol 属性从可选变为必需),那么可能需要编写迁移逻辑以处理这些更改。Core Data 提供了迁移机制来处理模型更改,但如果属性值缺失(例如,必需的字段缺失),迁移会失败。可以使用轻量级迁移或手动编写迁移代码来处理这些更改。

4、手动为缺失的属性提供默认值

在代码中,如果 symbol 属性为必需属性并且没有为它提供值,可以在插入数据时检查它是否存在,如果不存在则赋予一个默认值。

总结

此错误表明 Core Data 存储的某个条目缺少必需的 symbol 属性的值。要解决此问题,需要检查 symbol 属性的模型设置,确保它在数据库中有值。

因为是在Xcode中测试字段导致的报错问题,因此在清理旧的存储数据后,问题得到解决。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注