如何快速保存结构? [英] How to save a struct to realm in swift?
问题描述
通过从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屋!