在 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,你需要在插入行时手动指定主键。

Swift GRDB 中使用 encode(to:) 绑定主键

原文地址: https://www.cveoy.top/t/topic/oR96 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录