Swift GRDB 中使用 encode(to:) 绑定主键
在 Swift GRDB 中,'encode(to:)' 方法用于将对象编码成 SQLite 数据库中的行。如果你想要绑定对象的主键,可以通过调用 'encode(to: context:)' 方法来实现。
首先,你需要定义一个编码上下文,用于在编码时存储对象的主键。例如:
class MyObject: Codable, FetchableRecord, PersistableRecord {
var id: Int64?
var name: String
enum CodingKeys: String, CodingKey {
case id, name
}
func encode(to container: inout PersistenceContainer) {
container["name"] = name
}
func encode(to context: inout PersistenceEncodingContext) throws {
try encode(to: &context.container)
if let id = id {
context.userInfo[.primaryKey] = id
}
}
}
在上面的例子中,我们定义了一个 'MyObject' 类,它实现了 'PersistableRecord' 协议,并定义了一个 'encode(to: context:)' 方法。在这个方法中,我们首先调用 'encode(to: &context.container)' 方法将对象编码成容器,然后将对象的主键存储在编码上下文的 'userInfo' 字典中。
接下来,你可以使用 'context.userInfo[.primaryKey]' 来获取对象的主键,并将其绑定到 SQLite 数据库中的行。例如:
let object = MyObject(id: 1, name: "foo")
try dbQueue.write { db in
var container = PersistenceContainer()
try object.encode(to: &container)
let rowID = try container.insert(into: "myTable").insertedRowID
if let primaryKey = object.id {
db.execute(sql: "INSERT INTO myTable (id) VALUES (?)", arguments: [primaryKey])
}
}
在上面的例子中,我们首先将对象编码成容器,然后将容器插入到 'myTable' 表中,并获取插入行的 ID。接着,我们使用 'object.id' 获取对象的主键,并将其绑定到 'myTable' 表中的 ID 列。
注意,我们在 'encode(to: context:)' 方法中将对象的主键存储在编码上下文的 'userInfo' 字典中,而不是直接在容器中编码。这是因为 Swift GRDB 不支持在编码时同时指定主键和自动增长 ID。如果你需要同时指定主键和自动增长 ID,你需要在插入行时手动指定主键。
原文地址: https://www.cveoy.top/t/topic/oR96 著作权归作者所有。请勿转载和采集!