Swift GRDB encode(to:) 方法实现主键自增
在 Swift GRDB 中,可以使用 Column.autoincremented 属性来实现主键自增。例如,假设有一个名为 Person 的表,其中 id 列是主键:
struct Person: Codable, FetchableRecord, MutablePersistableRecord {
var id: Int64?
var name: String
var age: Int
static let id = Column('id')
static let name = Column('name')
static let age = Column('age')
mutating func didInsert(with rowID: Int64, for column: String?) {
id = rowID
}
static func createTable(in database: Database) throws {
try database.create(table: 'person') { t in
t.column(id, primaryKey: true)
t.column(name)
t.column(age)
}
}
}
在上面的代码中,id 列被声明为可选的 Int64 类型,并且定义了一个 createTable 方法来创建 person 表。在此方法中,使用 primaryKey 标志将 id 列标记为主键。这意味着每个 Person 实例都必须具有唯一的 id 值。
然后,在编写向数据库插入数据的代码时,可以使用 Column.autoincremented 属性来实现 id 列的自增:
let person = Person(name: 'Alice', age: 25)
try dbQueue.write { db in
try person.encode(to: db)
if person.id == nil {
// 如果 id 为空,则表示插入失败
print('Failed to insert person')
} else {
print('Inserted person with id (person.id!)')
}
}
在上面的代码中,使用 try person.encode(to: db) 将 person 对象写入数据库。如果 person 的 id 值为空,则表示插入失败。如果插入成功,则可以通过 person.id 属性访问自动生成的主键值。
注意:在使用 Column.autoincremented 属性时,必须将主键列定义为可选的,因为在插入新行时,数据库会自动为主键列生成值。如果将主键列定义为非可选的,则必须在插入新行时为其提供值,否则将引发错误。
原文地址: https://www.cveoy.top/t/topic/oR9d 著作权归作者所有。请勿转载和采集!