将 JSON 保存到核心数据

Posted

技术标签:

【中文标题】将 JSON 保存到核心数据【英文标题】:Saving JSON to Core Data 【发布时间】:2016-01-07 19:25:54 【问题描述】:

我查看了以下问题,但它们没有解决我遇到的问题:

Issue: Saving Json data to Core Data JSON to core-data

其他建议的链接甚至不接近我的问题。我的问题是——我正在从我自己的域中收集数据,使用 JSON 解码,然后尝试将数据插入核心数据。 99% 的时间都在工作,但我的应用偶尔会崩溃,并且我收到以下错误消息:

2016-01-07 09:49:33.096 AppleLawnApp[564:400038] CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的一个错误。 -[__NSCFSet addObject:]: 尝试用 userInfo (null) 插入 nil

2016-01-07 09:49:33.098 AppleLawnApp[564:400038] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFSet addObject:]:尝试插入 nil”

我已将它放在按钮的操作代码块中:

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext

    let url = NSURL(string: "http://www.mydomain/file.php")

    if url != nil   

        let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler:  (data, response, error) -> Void in

            if error == nil 

                let urlContent = NSString(data: data!, encoding: NSUTF8StringEncoding) as NSString!

                let data: NSData = urlContent.dataUsingEncoding(NSUTF8StringEncoding)!

                do 

                    let jsonObject = try (NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSArray)!

                    var index1 = 0

                    while index1 < jsonObject.count 

                        let newEntry = NSEntityDescription.insertNewObjectForEntityForName(MyTableData, inManagedObjectContext: context) as NSManagedObject

                        let maindata = (jsonObject[index1] as! NSDictionary)

                        let this1   = maindata["dBase1"] as! String

                        let this2   = maindata["dBase2"] as! String

                        let this3   = maindata["dBase3"] as! String

                        let this4   = maindata["dBase4"] as! String

                        let this5        = maindata["dBase5"] as! String

                        let this6       = maindata["dBase6"] as! String



                        newEntry.setValue(this1, forKey: "CD1")

                        newEntry.setValue(this2, forKey: "CD2")

                        newEntry.setValue(this3, forKey: "CD3")

                        newEntry.setValue(this4, forKey: "CD4")

                        newEntry.setValue(this5, forKey: "CD5")

                        newEntry.setValue(this6, forKey: "CD6")

                        do 

                            try context.save()

                        

                        catch 

                            print(error)

                        

                        let data1 = arrayOne(c1: this1 c2: this2, c3: this3, c4: this4, c5: this5, c6: this6)

                        self.myArray.append(data1)

                        index1++

                    

                

                catch 

                    print(error)

                

            

        )

        task.resume()

            


【问题讨论】:

【参考方案1】:

根据错误消息,我的第一个猜测是,您可能会在 json 中返回意外的 null 值,其中模型实体的值标记为非可选。也许在更新 NSManagedObject 之前尝试测试数据。以下是一些类似的方法:

if let this1 = maindata["dBase1"] 

    newEntry.setValue(this1, forKey: "CD1")

 else 

    assertionFailure("missing dBase1")

或者,像这样:

guard let this2 = maindata["dBase2"]
    , let this3 = maindata["dBase3"]
    , let this4 = maindata["dBase4"] else 

    assertionFailure("missing data")
    return


newEntry.setValue(this2, forKey: "CD2")
newEntry.setValue(this3, forKey: "CD3")
newEntry.setValue(this4, forKey: "CD4")

【讨论】:

我将对此进行测试。感谢您的意见。

以上是关于将 JSON 保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

无法将自定义对象从 API 保存到核心数据

在核心数据中保存动态生成的带有父->子关系的JSON数据?

如何使用 RestKit 将嵌套的 JSON 对象存储到核心数据中

在核心数据iOS中保存json数据

处理HTTP Post的正确方法,然后通过HTTP下载,然后保存到核心数据

主线程上的 NSFetchedResultsController 忽略从不同线程保存到核心数据?