Swift Core 数据无法第二次存储数据:Cocoa 错误 1560
Posted
技术标签:
【中文标题】Swift Core 数据无法第二次存储数据:Cocoa 错误 1560【英文标题】:Swift Core data can't store data second time : Cocoa error 1560 【发布时间】:2017-03-20 12:15:31 【问题描述】:我有核心数据和其中的三个对象。假设我有对象:Parent, Child, Item
。
Parent
有Set<Child>
,Child
有Set<Item>
,换句话说,
Parent have one to many relationship with Child
Child have one to many relationship with Item
Parent:
- var childs : Set<Child>
Child:
- var items : Set<Item>
为了在里面存储数据,我有方法:
func insert(parent : Parent)
// remove all old Childs
parent.removeChild(Parent.childs)
for data in datas
let child = self.newChildFromData(data)
for data2 in datas2
let item = self.newItemFromData2(data2)
child.addItem(item)
parent.addChild(child)
do
try managedObjectContext.save()
catch
print(error.debugDescription)
注意 这不是真正的代码,但它足以理解问题。
当我第一次运行方法时(空数据库),它工作正常,但是当我第二次运行它时,它给我错误
The operation couldn’t be completed. (Cocoa error 1560.)
Error Domain=NSCocoaErrorDomain Code=1560 "(null)" UserInfo=NSDetailedErrors=(
"Error Domain=NSCocoaErrorDomain Code=1570 \"The operation couldn\U2019t be completed. (Cocoa error 1570.)\" UserInfo=NSValidationErrorKey=server, NSLocalizedDescription=The operation couldn\U2019t be completed. (Cocoa error 1570.), NSValidationErrorObject...
那可能是什么?
【问题讨论】:
1560 表示有多个错误; 1570 是“NSValidationMissingMandatoryPropertyError”的值,这可能意味着您有一个带有验证约束的属性,这使得它成为强制性的,但您的代码将其设置为 nil。 是的,我读到了这一点,但是为什么当我第一次运行方法时它没有错误地存储元素,但第二次使用相同的对象时发生了这个错误?我怀疑删除旧值有问题,但我不知道是什么。 您是否有每个孩子都必须有父母的约束? parent.removeChild(parent.childs) 将意味着子对象不再有父对象(它实际上并没有删除子对象)。 是的,现在我明白了,这是真的。我有强制性的父字段。当我删除关系时,这是无效的实体。 【参考方案1】:如果您在更改代码以满足这两个要求后遇到错误,请尝试清理您的构建并从您的 iPhone 模拟器/iPhone 设备中删除应用程序。也可以参考图书馆Core Data Constants Reference
另外你也可以参考Core Data Model Versioning and Data Migration Programming Guide。它将帮助您迁移核心数据模型。
【讨论】:
是的,如果我删除我的应用程序并再次运行它,它可以工作,但是当我运行代码以重新加载我的数据时,它再次出现错误。这不是模型版本控制或转换错误。我需要按需重新加载数据。以上是关于Swift Core 数据无法第二次存储数据:Cocoa 错误 1560的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 第二次加载后 Tableview 无法正确重新加载
Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载
无法保存数据 --- Swift、IOS、Core 数据 --- 线程 1:信号 SIGABRT