Как превратить значения NSManagedObject в словарь с парами ключ-значение? - PullRequest
0 голосов
/ 10 мая 2018

В моем приложении есть настройка 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 голосов
/ 12 мая 2018

Я вижу два пути сюда. Первый - иметь протокол с некоторой функцией «кодирования» 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
    }
 }
0 голосов
/ 10 мая 2018

Вы можете использовать эту функцию

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...