如何在Core Data中存储JSON响应?

时间:2014-03-28 05:23:09

标签: ios json core-data

我有一个Core Data对象。

我很好奇,作为一个相对缺乏经验的iPhone开发人员,是否有人可以推荐一种方法,以及适合iPhone的JSON实现,这将允许我将JSON响应存储为核心数据对象。

我从JSON响应中获得了5条记录(词典)。我需要将它们存储在Core Data中,并在必要时检索它们。

我已经在这一点上搜索了一个教程/代码示例,但没有成功,所以我们将非常感激地收到任何帮助。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

将Core Data属性设置为可转换。然后使用此扩展名:

extension NSObject {
    static func storeJSON(dataToStore: [String: AnyObject], completion: (data: NSData?) -> Void) {
        do {
            let data = try NSJSONSerialization.dataWithJSONObject(dataToStore, options: [])
            completion(data: data)
        } catch let error as NSError {
            print("NSJSONSerialization Error: \(error)")
            completion(data: nil)
        }
    }

    func retrieveJSON(completion: (json: JSON) -> Void) {
        if let data = self as? NSData {
            do {
                let nsJSON = try NSJSONSerialization.JSONObjectWithData(data, options: [])
                completion(json: JSON(nsJSON))
            } catch let error as NSError {
                print("NSJSONSerialization Error: \(error)")
                completion(json: nil)
            }
        }
    }
}

如果您不使用SwiftJSON,请使用:

extension NSObject {
    static func storeJSON(dataToStore: [String: AnyObject], completion: (data: NSData?) -> Void) {
        do {
            let data = try NSJSONSerialization.dataWithJSONObject(dataToStore, options: [])
            completion(data: data)
        } catch let error as NSError {
            print("NSJSONSerialization Error: \(error)")
            completion(data: nil)
        }
    }

    func retrieveJSON(completion: (json: AnyObject?) -> Void) {
        if let data = self as? NSData {
            do {
                let nsJSON = try NSJSONSerialization.JSONObjectWithData(data, options: [])
                completion(json: nsJSON)
            } catch let error as NSError {
                print("NSJSONSerialization Error: \(error)")
                completion(json: nil)
            }
        }
    }
}

使用user.jsonTest作为核心数据中的可转换的示例:

func testThis() {
    makeSaveData() {
        self.user.jsonTest!.retrieveJSON() {
            json in
            print("json: \(json)")
        }
    }
}

func makeSaveData(completion: () -> Void) {
    var solarResourceDic: [String: String] = [:]
    var srDics: [[String: String]!] = []

    for i in 0..<5 {
        solarResourceDic = [:]
        solarResourceDic["system_capacity"] = "\(i)"
        solarResourceDic["azimuth"] = "\(i + 1)"
        solarResourceDic["tilt"] = "\(i + 2)"
        solarResourceDic["array_type"] = "\(i + 3)"
        solarResourceDic["module_type"] = "\(i + 4)"
        solarResourceDic["losses"] = "\(i + 5)"
        srDics.append(solarResourceDic)
    }
    let dic = ["Solar Resource": srDics]

    NSObject.storeJSON(dic) {
        data in
        if data != nil {
            self.user.jsonTest = data
            appDelegate.coreData.saveContext()
            completion()
        } else {
            print("Error storing data")
        }
    }
}

答案 2 :(得分:1)

您可以按照this精彩教程了解如何将json保存到核心数据。通常,您需要学习以下内容:如何解析json提要(它将导致带有已解析项的NSDictionaries)以及如何将此词典保存到持久性存储中。本教程将介绍两者。

答案 3 :(得分:1)

我知道这已经过时但是有一个名为Sync的库可以将json保存到DB

Sync简化了解析JSON响应并将其转换为Core Data的日常工作。它使用约定优于配置的范例来促进您的工作流程。 将JSON同步到核心数据是一项重复性任务,通常需要添加大量样板代码。映射属性,映射关系,插入,删除和更新的差异通常是在应用程序之间不会更改的任务。考虑到这一点,我们接受了挑战,将其抽象为图书馆。 Sync使用您的Core Data模型的知识来推断您的JSON和Core Data之间的所有映射,一旦您使用它,感觉非常明显,您会想知道为什么您之前没有这样做。

链接: - Sync