如何将NSManagedObject值转换为具有键和值对的Dictionary?

时间:2018-05-10 13:21:12

标签: arrays swift dictionary core-data

我在我的应用程序中设置了Core Data,这样当没有互联网连接时,应用程序将在本地保存数据。建立连接后,它将触发在线模式,然后我需要将存储在Core Data中的数据发送到我的数据库。

我的问题是你如何将一个实体变成这样的字典:

<Response: 0x1c0486860> (entity: AQ; id: 0xd000000000580000 <x-coredata://D6656875-7954-486F-8C35-9DBF3CC64E34/AQ/p22> ; data: {
amparexPin = 3196;
dateFull = "\"10/5/2018\"";
finalScore = 34;
hasTech = No;
intervention = Before;
responseValues = "(\n    31,\n    99,\n    82,\n    150,\n    123,\n    66,\n    103,\n    125,\n    0,\n    14\n)";
timeStamp = "\"12:47\"";
who = "Luke";
})

进入这个:

amparexPin: 5123
timeStamp: 10:30
hasTech: No
intervention: Before

基本上是一个字典,我试图对每个实体上的每组数据执行相同的操作。我知道这听起来过于复杂,但每个实体都需要通过相同的过滤器/函数然后将其数据发送到数据库。任何有关这方面的帮助都会很棒!

2 个答案:

答案 0 :(得分:0)

你可以使用这个功能

func objectAsDictionary(obj:YourObject) -> [String: String] {
    var object: [String: String] = [String: String]()

    object["amparexPin"] = "\(obj.amparexPin)"

    object["timeStamp"] = "\(obj.timeStamp)"

    object["hasTech"] =  "\(obj.hasTech)"

    object["intervention"] =  "\(obj.intervention)"


    return object
}

答案 1 :(得分:0)

我看到两种方式去这里。第一个是使用一些&#34;编码&#34;函数,toDictionary() -> [String, Any?]每个托管对象类在扩展中实现,然后在发送之前在每个对象上调用此函数 这种方式的优点是您可以更精确地控制实体和字典之间的每个映射,缺点是您需要为核心数据模型中的每个实体实现它。

另一种方法是利用NSEntityDescription和KVC来提取一个函数中的所有值。此类包含所有属性的字典attributesByName,可用于使用键值编码提取所有值。根据您是否需要映射值的数据类型,您可以从NSAttributeDescription获取该值。 (如果您需要处理关系等问题,还有propertiesByName)。

一个简化的例子。 (直接写在这里所以不保证它编译)

static func convertToDictionary(object: NSManagedObject) -> [String, Any?] {
    let entity = object.entity
    let attributes = entity.attributesByName

    var result: [String: Any?]
    for key in attributes.keys {
        let value = object.valueForKey: key)
        result[key] = value
    }
 }