因关系改变而产生的错误

Posted

技术标签:

【中文标题】因关系改变而产生的错误【英文标题】:Error due to change in relationship 【发布时间】:2017-03-01 10:16:27 【问题描述】:

当我将以下关系从 one-to-one 更改为 one-to-many 时,我收到以下错误消息

eventSch?.setValue(eventDesc, forKey: "eventDec")
eventDesc.setValue(eventSch, forKey: "eventSchedule")

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不可接受的值类型 多对多关系:property = "eventDec";所需类型 = NSSet; 给定类型 = EventDec;价值=(实体: 事件十二月;编号:0x60800022bcc0 ; 数据: eventSchedule = nil; 事件状态 = 0; )。'

如何摆脱这个错误?

【问题讨论】:

你制作了新的模型版本吗?如果您只是在开发中,您可以简单地删除并重新安装。 不,我没有制作新版本。你的意思是删除模型并重新安装? 假设eventScheduleeventDec 是反向关系,你不需要同时设置。最简单的就是设置to-one结束关系(CoreData会自动更新逆向),所以删除第一行就行了。 @pbasdf,实际上你的解决方案解决了我所有的问题。非常感谢:) :) 【参考方案1】:

这:eventSch?.setValue(eventDesc, forKey: "eventDec") 导致错误,因为您提供了一个实体;相反,您应该提供一个 NSSet。

我不太了解 Objective-C;但是,您的代码应该类似于以下内容:

NSMutableSet* eventDescSet = [NSMutableSet set];
[eventDescSet addObject: eventDesc];  // you have your set with one item
eventSch?.setValue(eventDescSet, forKey: "eventDec")

另外,为了清楚起见,我会使用更具描述性的名称。

【讨论】:

感谢您的解释,我的代码很快 :) 抱歉 :)。看到你在使用 KVO,我错误地认为它是 Objective-C。【参考方案2】:

您的设备上有一个基于旧版本的 SQL 文件,因此当应用尝试基于新模型加载它时,它无法弄清楚如何读取它。

[硬解]如果您的应用已经在应用商店发布,那么您应该将模型回滚到发布时的状态,然后根据您的更改创建一个新模型.

[简单的解决方案]如果您是唯一拥有该应用程序的人,并且您仍处于开发阶段,则没有理由制作模型版本。只需从您的手机(和/或模拟器)中删除并重新安装。基于旧版本的 SQL 文件将消失。

【讨论】:

是的,除了我上面说的问题,我也遇到了这个问题

以上是关于因关系改变而产生的错误的主要内容,如果未能解决你的问题,请参考以下文章

windows多线程编程

01数据库的实体关系

RxJava observeOn()与subscribeOn()的关系

为啥我的产品->存档因“非法尝试在不同上下文中的对象之间建立关系”压缩类型“而失败?

Cypher where子句因多条路径而失败

Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`