【问题标题】:Core Data: Error if deleting unsaved object核心数据:删除未保存的对象时出错
【发布时间】:2010-07-28 14:37:02
【问题描述】:

我在核心数据项目上遇到了一些问题。我有一个带有 NSManagedObjects 的 NSArrayController 和 + / - 按钮。如果我在保存文件后删除行中的一个对象,它可以正常工作,但是如果我添加一个新对象,然后立即再次删除它(不更改任何默认值),我会收到错误:

Serious application error.  Exception was caught during Core Data change processing: Unknown number type or nil passed to arithmetic function expression. with userInfo (null)  
Unknown number type or nil passed to arithmetic function expression.  

如果我撤消新对象的添加,情况也是如此。

谁能指点我该怎么做?我认为这与它只有一个临时 ID 有关,但我不知道如何解决它。

【问题讨论】:

    标签: objective-c cocoa core-data nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    我找到了问题和解决方案。为了记录,我将描述它。

    问题在于它的 init 函数中的对象在其自身上添加了一个观察者。这可能是触发错误的原因。如果我在删除对象之前将自己删除为观察者,则不会产生错误。

    【讨论】:

    • 您应该覆盖NSManagedObject-init... 方法或其-dealloc 方法。如果您需要添加观察者,您应该在-awakeFromInsert-awakeFromFetch 中添加。
    • 根据文档“覆盖注意事项的方法”,是否允许覆盖 initWithEntity:insertIntoManagedObjectContext:amd dealloc?我使用 init 而不是 awake 的原因是因为我发现 awake 并不总是被调用(如果用户撤消或其他东西)。但我可能错了。
    • 您对撤消和重做的看法是正确的,在 10.6+ 中,还有一个附加方法 awakeFromSnapshotEvent,它在撤消/重做中也被调用。作为 10.5 的解决方法,我更改了 ManagedObjectContext 以允许撤消和重做工作观察 github.com/mbrugger/CoreDataDependentProperties/blob/master/…
    • 但是在 initWithEntity 中这样做有什么问题吗?只要我叫超级?
    【解决方案2】:

    表通常不包含 NSManagedObjects。相反,要么 NSArrayController 通过绑定将托管对象的属性作为值提供,要么提供符合 NSTableViewDataSource 的对象。可以通过多种方式删除在这些场景中的任何一个中提供的选定对象。问题是,您根本没有解释您的案件是如何成立的。

    您的删除(无论您的按钮连接到什么目标/操作)是否有可能被传递为零或意外?如果您要求托管对象上下文删除浮点值或其他一些随机的东西,我可以想象一个同样可怕的错误......

    【讨论】:

    • 很抱歉我的描述有点快。正如你所说的,一个 NSArrayController 持有对象,并绑定到一个 NSTableView。我试图检查我要删除的对象是否正确,并且确实如此。没有什么问题。该错误也会在片刻之后首次发生(1 个或多个运行循环)
    • Ssssooooo .....您如何确切地删除该对象?事物的究竟是如何被绑定的?帮助我们帮助您。
    • 装订完全在书之后。 NSArrayController 设置为实体模式,我的对象作为实体名称。该表已绑定公关。属性上的列。我认为问题不在这里。 - 我尝试了不同的删除方法。它们都产生相同的错误([arrayController removeObject:theObject] 和 [managedObjectContext deleteObject:theObject]),但正如我所说,当我按下撤消时也会出现错误。因此,只需说添加对象-> 撤消就会产生错误。知道错误的实际含义吗?
    • 我环顾四周,发现了一个嫌疑人:多个上下文。我没有要求任何地方制作多个上下文,但我担心我得到了。不知道有没有铃声。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多