托管对象上下文不会保存——没有错误

Posted

技术标签:

【中文标题】托管对象上下文不会保存——没有错误【英文标题】:Managed object context won't save--no error 【发布时间】:2015-03-23 20:25:02 【问题描述】:

在 Swift 应用程序中遇到一个奇怪的 Core Data 问题。我相当精通 Core Data,但在 Swift 中使用它时似乎有一些(新的)粗糙边缘和“陷阱”。

我可以很好地将新对象插入到上下文中,并在运行时从我的应用程序其他地方的相同上下文中检索它们。但是,每当我尝试 save 上下文时,它都会无缘无故地失败(managedObjectContext.save() 返回 false)。当我记录或检查错误指针时,它是 0x0000000...所以我没有得到任何关于哪里出错的提示。

func saveContext() 
    let error = NSErrorPointer()

    if (!self.managedObjectContext.save(error)) 
        println("*** Failed to save MOC with error: \(error.debugDescription)")
    

我设置了一个断点并检查了上下文,下面的部分结果...我还找到了“insertedObjects”属性,确实找到了我试图保存的所有数据。那里一切看起来都很好。

为什么不保存上下文?我意识到没有错误或异常,没有太多事情要做,但我希望有人遇到过这个问题,或者知道解决办法,或者至少可以为我指明正确的方向。谢谢:)

我打开 SQL 调试并尝试保存时得到以下信息。无论如何,我都不是 SQL 专家,但这看起来好像缺少了什么。也就是说,我没有看到任何 INSERT 语句。此外,奇怪的是,只有在我第一次尝试在启动应用程序时添加书签时才会生成此输出。之后就是妈妈了。

2015-03-23 14:19:13.152 NTBrowser[3535:157990] CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' 2015-03-23 14:19:13.152 NTBrowser[3535:157990] CoreData: sql: pragma journal_mode=wal 2015-03-23 14:19:13.152 NTBrowser[3535:157990] CoreData: sql: pragma cache_size=200 2015-03-23 14:19:13.153 NTBrowser[3535:157990] CoreData: sql: 从 Z_METADAT 中选择 Z_VERSION、Z_UUID、Z_PLIST

【问题讨论】:

请检查此答案***.com/a/33379649/5093900 在我的情况下,原因是“尝试保存未填写足够字段的对象”。 【参考方案1】:

我建议从启用 SQL 调试输出开始。 XCode4 and Core Data: How to enable SQL Debugging 可能没有进行任何更改。

【讨论】:

谢谢,这是一个很好的建议——我忘记了那个论点。当我打开 SQL 调试时,我得到几行“设置”输出。但是,在那之后,我的提取和(尝试的)保存都不会产生任何额外的输出(奇怪的是)。 实际上,现在我 am 在获取时获取 SQL 输出。那里的一切似乎都不错,我希望它在屏幕上看起来也不错……但是当我尝试保存时,我没有得到任何 SQL 输出。我的猜测是,Core Data 甚至不做任何 SQL 语句就犹豫不决? 完全正确。当您更改托管对象属性值时,它只影响内存中的对象。只有在调用 save 方法时,才会通过执行多个插入、更新和删除语句来实际保存数据。问题是为什么当你调用它时没有应用任何更改。 我不明白它是如何认为它没有什么可保存的。上下文的“insertedObjects”属性包含我的对象。 在我原来的问题中添加了 SQL 调试输出。

以上是关于托管对象上下文不会保存——没有错误的主要内容,如果未能解决你的问题,请参考以下文章

调试器在核心数据保存时停止,但没有错误输出

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

ios/objective-c:保存核心数据时出错

托管对象上下文的临时对象

选项卡栏应用程序更新实体中的共享托管对象上下文不会传播到其他选项卡

使用Core Data将文本从文本字段分配到托管对象上下文