如何使用 SQLite.swift 更新或插入

How to update or insert with SQLite.swift

如果该行已经存在,我想更新该行的列,但如果它不存在,那么我想插入一个新行。

相关问题

一般SQL

这类问题很受欢迎

和SQL特别是

正在寻找 SQLite.swift 实现

我试图通过使用 SQLite.swift wrapper for iOS development. I chose this framework because it was recommended on raywenderlich.com 来节省开发时间。我认为有一个更新或插入的语法示例会很有用。

策略

this answer 中,Sam Saffron 说:

If you are generally doing updates I would ..

  1. Begin a transaction
  2. Do the update
  3. Check the rowcount
  4. If it is 0 do the insert
  5. Commit

If you are generally doing inserts I would

  1. Begin a transaction
  2. Try an insert
  3. Check for primary key violation error
  4. if we got an error do the update
  5. Commit

This way you avoid the select and you are transactionally sound on Sqlite.

这对我来说很有意义,所以在我下面的回答中,我提供了一个“通常进行更新”的示例。

在此示例中,用户词典存储在自定义键盘上键入的单词。如果该词已在词典中,则该词的频率计数递增 1。但如果该词之前未输入过,则会插入一个新行,默认频率为 1。

table 是使用以下架构创建的:

let userDictionary = Table("user_dictionary")
let wordId = Expression<Int64>("id")
let word = Expression<String>("word")
let frequency = Expression<Int64>("frequency")        

// ...

let _ = try db.run( userDictionary.create(ifNotExists: true) {t in
    t.column(wordId, primaryKey: true)
    t.column(word, unique: true)
    t.column(frequency, defaultValue: 1)
    })

从问题中得出,这就是我们想要做的:

  1. Begin a transaction
  2. Do the update
  3. Check the rowcount
  4. If it is 0 do the insert
  5. Commit

代码如下所示。

let wordToUpdate = "hello"

// ...

// 1. wrap everything in a transaction
try db.transaction {

    // scope the update statement (any row in the word column that equals "hello")
    let filteredTable = userDictionary.filter(word == wordToUpdate)

    // 2. try to update
    if try db.run(filteredTable.update(frequency += 1)) > 0 { // 3. check the rowcount

        print("updated word frequency")

    } else { // update returned 0 because there was no match

        // 4. insert the word
        let rowid = try db.run(userDictionary.insert(word <- wordToUpdate))
        print("inserted id: \(rowid)")
    }
} // 5. if successful, transaction is commited

请参阅 SQLite.swift documentation 以获得更多帮助。

请查看此答案,这是了解如何创建 Table 并在其中插入一行的最佳方式。