Обновление строк в SQLite
Запрос UPDATE задает новые значения столбцов
и обычно ограничивает строки через WHERE.
Без условия изменится вся таблица. Подготовленный шаблон связывает новое значение и ключ строки:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("revise.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS notes ("
"id INTEGER PRIMARY KEY,"
"title TEXT NOT NULL,"
"done INTEGER NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO notes (title, done) "
"VALUES ('draft', 0)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* update = nullptr;
if (sqlite3_prepare_v2(
db,
"UPDATE notes SET done = ? WHERE id = ?",
-1,
&update,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_int(update, 1, 1);
sqlite3_bind_int(update, 2, 1);
if (sqlite3_step(update) != SQLITE_DONE) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_finalize(update);
sqlite3_close(db);
return 1;
}
std::cout << sqlite3_changes(db) << "\n";
sqlite3_finalize(update);
sqlite3_close(db);
return 0;
}
Счетчик от sqlite3_changes показывает, сколько
строк реально изменилось. Текстовые поля обновляют
тем же способом:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("revise.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_stmt* update = nullptr;
if (sqlite3_prepare_v2(
db,
"UPDATE notes SET title = ? WHERE id = ?",
-1,
&update,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(update, 1, "final", -1, SQLITE_STATIC);
sqlite3_bind_int(update, 2, 1);
sqlite3_step(update);
sqlite3_finalize(update);
sqlite3_stmt* check = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT title FROM notes WHERE id = ?",
-1,
&check,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_int(check, 1, 1);
if (sqlite3_step(check) == SQLITE_ROW) {
const char* title =
reinterpret_cast<const char*>(
sqlite3_column_text(check, 0)
);
std::cout << title << "\n";
}
sqlite3_finalize(check);
sqlite3_close(db);
return 0;
}
Создайте таблицу meters в utility.db
с полями label и reading, добавьте
строку и измените показание на 105 по
id 1.
Переименуйте метку с "kitchen" на
"hall" для той же записи и выведите
новую метку.