Делаем Realm & Unbox приятной игрой

Я учусь анализировать JSON в Swift, исходя из Android/Java, и я использую Unbox от Джона Санделла, чтобы помочь мне в этом, что напоминает мне GSON. Ссылка: модуль распаковки

Я использую Realm в качестве базы данных для локального хранения данных. Ссылка: Realm.io

Было бы здорово найти рабочий процесс для анализа класса с помощью JSON и сохранения его в Realm. Я не хочу иметь структуру, которая реализует Unboxable И класс, который реализует Object (Realm), потому что тогда я должен отражать их. Это не слишком много работы для моего текущего проекта, но это довольно уродливо...

Кто-нибудь из вас пробовал подобный рабочий процесс?


person TomCB    schedule 09.06.2016    source источник


Ответы (3)


Я не думаю, что вам нужны два отдельных типа. Мое предложение состоит в том, чтобы создавать ваши объекты как классы Swift, которые наследуются от класса Object Realm, а затем также согласовывать их с протоколом Unboxable, который предлагает Unbox. (Хотя в примерах на странице Unbox используются структурные модели, в коде или документации нет ничего, что указывало бы на то, что классы не будут работать.)

Объекты модели Realm работают так же, как и любые другие классы: в дополнение к определению любых свойств объектов, которые вы хотите сохранить в базе данных, вы также можете определить методы и инициализаторы и даже указать свойства, которые вы хотите, чтобы Realm игнорировал. Это позволяет вам создать объект, который служит как моделью Realm, так и моделью JSON, совместимой с Unbox.

person AustinZ    schedule 09.06.2016

Более лаконичный подход, не требующий переопределения обязательных инициализаторов (на основе твита Марин Тодоров):

class Car: Object, Unboxable {
    dynamic var vendor: String = ""
    dynamic var modelName: String = ""
    dynamic var electric: Bool = false

    required convenience init(unboxer: Unboxer) throws {
        self.init()
        self.vendor = try unboxer.unbox(key: "vendor")
        self.modelName = try unboxer.unbox(key: "modelName")
        self.electric = try unboxer.unbox(key: "electric")
    }
}
person Daniel Witurna    schedule 24.07.2017

Вот пример, который отлично работает для меня:

class ProviderRealm: Object, Unboxable {
    dynamic var identifier: String = "demo"
    dynamic var name: String?
    dynamic var logo: String?

    /// Initializer used for unboxing of JSON string
    required init(unboxer: Unboxer) throws {

        self.identifier = (try? unboxer.unbox(key: "identifier")) ?? "demo"
        self.name = try? unboxer.unbox(key: "name")
        self.logo = try? unboxer.unbox(key: "logo")

        super.init()
    }

    required init(realm: RLMRealm, schema: RLMObjectSchema) {
        super.init(realm: realm, schema: schema)
    }

    required init() {
        super.init()
    }

    required init(value: Any, schema: RLMSchema) {
        super.init(value: value, schema: schema)
    }

    override static func primaryKey() -> String? {
        return "identifier"
    }
}
person Claudia Fitero    schedule 16.02.2017