托管对象上下文不会保存——没有错误
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 托管对象上下文的正确方法?