Как обновить или вставить с помощью SQLite.swift

Я хочу обновить столбец строки, если строка уже существует, но если она еще не существует, я хочу вставить новую строку.

Связанные вопросы

Этот тип вопросов популярен для SQL в целом.

и SQLite в частности

Ищем реализацию SQLite.swift

Я пытаюсь сэкономить время разработки, используя оболочку SQLite.swift для разработки под iOS. Я выбрал этот фреймворк, потому что он был рекомендован на сайте raywenderlich.com. Думаю, было бы полезно иметь пример синтаксиса для обновления или вставки.

Стратегия

В этом ответе Сэм Саффрон говорит:

Если вы обычно делаете обновления, я бы ..

  1. Начать транзакцию
  2. Сделайте обновление
  3. Проверить количество строк
  4. Если это 0, сделайте вставку
  5. Совершить

Если вы обычно делаете вставки, я бы

  1. Начать транзакцию
  2. Попробуйте вставить
  3. Проверить наличие ошибки нарушения первичного ключа
  4. если у нас возникла ошибка, сделайте обновление
  5. Совершить

Таким образом, вы избегаете выбора и получаете надежную транзакцию на Sqlite.

Для меня это имеет смысл, поэтому в своем ответе ниже я привожу пример обычно выполняемых обновлений.


person Suragch    schedule 22.04.2016    source источник


Ответы (2)


В этом примере в пользовательском словаре хранятся слова, набранные на настраиваемой клавиатуре. Если слово уже есть в словаре, то частота этого слова увеличивается на 1. Но если слово не было введено ранее, то новая строка вставляется с частотой по умолчанию 1.

Таблица была создана по следующей схеме:

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. Начать транзакцию
  2. Сделайте обновление
  3. Проверить количество строк
  4. Если это 0, сделайте вставку
  5. Совершить

Вот как будет выглядеть код.

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.

person Suragch    schedule 22.04.2016

Отметьте этот ответ, это лучший способ узнать, как создать таблицу и вставить в нее строку.

https://stackoverflow.com/a/28642293/5247430

person Super Developer    schedule 01.07.2020