如何快速保存结构? [英] How to save a struct to realm in swift?

查看:102
本文介绍了如何快速保存结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过从Object继承,可以将Realm与类一起使用.但是,如何保存一个包含多个字段的struct到Swift中呢?例如

It is easy to use Realm with classes by inheriting from Object. But how would I save a struct containing several fields to realm in Swift? E.g.

struct DataModel {
    var id = 0
    var test = "test"
}

我知道文档中明确支持的类型.但是也许有一个不错的解决方法,或者甚至更好-某个领域的人可以写有关结构的未来计划.

I know the documentation is clear about supported types. But maybe there is nice workaround or - even better - someone from realm could write about future plans about structs.

推荐答案

我建议您使用协议,以达到所需的目的.

I' suggest you to use protocols, to achive what you want.

1)创建结构

struct Character {
    public let identifier: Int
    public let name: String
    public let realName: String
}

2)创建您的领域对象

final class CharacterObject: Object {
    dynamic var identifier = 0
    dynamic var name = ""
    dynamic var realName = ""
    override static func primaryKey() -> String? {
        return "identifier"
    }
}

3)使用协议将我们的结构转换为Realm Object

public protocol Persistable {
    associatedtype ManagedObject: RealmSwift.Object
    init(managedObject: ManagedObject)
    func managedObject() -> ManagedObject
}

4)使您的结构持久化

extension Character: Persistable {
    public init(managedObject: CharacterObject) {
        identifier = managedObject.identifier
        name = managedObject.name
        realName = managedObject.realName
    }
    public func managedObject() -> CharacterObject {
        let character = CharacterObject()
        character.identifier = identifier
        character.name = name
        character.realName = realName
        return character
    }
}

有了这些工具,我们准备实现持久层的插入方法.

With these tools in place, we are ready to implement the insertion methods of our persistence layer.

5)例如写入数据

public final class WriteTransaction {
    private let realm: Realm
    internal init(realm: Realm) {
        self.realm = realm
    }
    public func add<T: Persistable>(_ value: T, update: Bool) {
        realm.add(value.managedObject(), update: update)
    }
}

// Implement the Container
public final class Container { 
    private let realm: Realm
    public convenience init() throws {
        try self.init(realm: Realm())
    }
    internal init(realm: Realm) {
        self.realm = realm
    }
    public func write(_ block: (WriteTransaction) throws -> Void) 
    throws {
        let transaction = WriteTransaction(realm: realm)
        try realm.write {
            try block(transaction)
        }
    }
}

5)使用魔术!

let character = Character(
    identifier: 1000,
    name: "Spiderman",
    realName: "Peter Parker"
)
let container = try! Container()
try! container.write { transaction in
    transaction.add(character)
}

惊人的来源:使用具有值类型的领域& 我的文章

Amazing source : Using Realm with Value Types & My Article

这篇关于如何快速保存结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆