在 Swift GRDB 中,我们可以使用 DatabaseValue 类型的 .null 值来表示自增的主键。我们可以在模型类中使用 Column 属性来定义主键和自增:

import GRDB

struct Person: Codable, FetchableRecord, MutablePersistableRecord {
    var id: Int64?
    var name: String
    var email: String
    
    static let databaseTableName = "persons"
    static let idColumn = Column("id")
    
    // Define primary key and auto-increment
    static var databasePrimaryKey: PrimaryKey { 
        return idColumn
    }
    static var databaseColumnConstraintBindings: [CodingKeys: ColumnConstraintBinding]? { 
        return [idColumn: ColumnConstraintBinding(isPrimary: true, isAutoIncrement: true)]
    }
    
    // MARK: - Persistence
    
    mutating func didInsert(with rowID: Int64, for column: String?) { 
        id = rowID
    }
}

在上面的例子中,我们定义了一个 Person 模型类,它有一个可选的 id 属性作为主键,并且定义了 idColumndatabasePrimaryKey 属性来指定主键。我们还定义了一个 databaseColumnConstraintBindings 属性来指定 idColumn 的约束条件,其中 isAutoIncrement 设置为 true 表示这是一个自增的主键。

当我们需要将 Person 对象写入数据库时,我们可以使用 encode(to:) 方法并在 EncodableRecord 协议中实现它:

let person = Person(name: "John", email: "john@example.com")
try dbQueue.write { db in
    try person.encode(to: db)
}

在上面的例子中,我们首先创建了一个 Person 对象,然后在 dbQueue.write 事务中使用 encode(to:) 方法将其写入数据库。由于 id 属性是可选的,并且我们在模型类中指定了它是一个自增的主键,因此数据库将为我们自动生成一个唯一的主键值,并将其赋值给 id 属性。在写入事务完成后,我们可以在 didInsert(with:for:) 方法中访问新的主键值。

Swift GRDB 自增主键:使用 `encode(to:)` 方法写入数据库

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

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