swift - 如何快速将结构保存到 Realm ?

标签 swift realm

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

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

我知道文档清楚地说明了受支持的类型。但也许有很好的解决方法,或者 - 甚至更好 - 来自 Realm 的人可以写下关于结构的 future 计划。

最佳答案

我建议您使用协议(protocol)来实现您想要的。

1) 创建您的结构

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

2) 创建你的 Realm 对象

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

3) 使用协议(protocol)将我们的结构转换为 Realm 对象

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
    }
}

有了这些工具,我们就可以实现持久层的插入方法了。

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)
}

惊人的来源:Using Realm with Value Types & My Article

关于swift - 如何快速将结构保存到 Realm ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060391/

相关文章:

json - Swift - "Instance member cannot be used on type"错误的简单修复?

swift - 如何在 Realm 中建模 3 个模型之间的关系?

ios - Realm 是否有一些方便的方法可以删除所有具有相同属性的 RLMObject?

java - 将 Realm 与 Gson 一起使用

ios - 关于 header 'RealmSwift-Swift.h' 未找到错误

swift - Realm :使用 Alamofire 将 JSON 映射到 Realm 对象

ios - 为什么我的类明明有 NSManagedObject 属性却出现错误?

Swift 多点视频应用程序不会读取数据

ios - 使用自动布局和 NSLayoutConstraints 以编程方式检索 UIView 的宽度和高度?

ios - Realm 模型中的单一反向关系