在 Swift GRDB 中,我们可以使用 TableDefinition 中的 column(...) 方法来定义表的列。我们可以指定一个列为主键,并且让它自增:

let dbQueue = try DatabaseQueue(path: "path/to/database.sqlite")

try dbQueue.write { db in
    try db.create(table: "users") { t in
        t.column('id', .integer).primaryKey().autoincrement()
        t.column('name', .text)
        t.column('age', .integer)
    }
}

在上面的示例中,我们创建了一个名为 'users' 的表,并定义了三个列: 'id'、 'name' 和 'age'。我们指定 'id' 列为主键,并使用 autoincrement() 方法让其自增。

在我们将数据写入数据库时,我们可以使用 TableMappinginsert(...) 方法来指定要插入的数据,并自动填充自增主键列的值:

struct User: Codable, FetchableRecord, PersistableRecord {
    var id: Int64?
    var name: String
    var age: Int
}

let user = User(name: "John", age: 30)

try dbQueue.write { db in
    try user.insert(db)
}

在上面的示例中,我们定义了一个 User 结构体,并使用 PersistableRecord 协议让它可以写入数据库。我们将 user 实例插入了数据库中,并自动填充了主键列 'id' 的值。注意,我们需要将主键列 'id' 声明为一个可选类型,以便在插入新记录时,自增主键列可以填充其值。

如果我们想手动指定主键列的值,我们可以使用 TableMappinginsert(...) 方法的另一个重载,该重载接受一个 onConflict 参数,用于处理冲突。我们可以将 onConflict 参数设置为 .replace,以便在主键冲突时更新现有记录:

let user = User(id: 1, name: "John", age: 30)

try dbQueue.write { db in
    try user.insert(db, onConflict: .replace)
}

在上面的示例中,我们将 user 实例插入了数据库中,并手动指定了主键列 'id' 的值。我们还将 onConflict 参数设置为 .replace,以便在主键冲突时更新现有记录。

Swift GRDB: 如何绑定主键并实现自增功能

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

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