1. SQLite の概要
SQLite は、軽量のリレーショナル データベース管理システム (RDBMS) であり、オープン ソース、構成不要、サーバー側、自己完結型、管理不要のトランザクション SQL データベース エンジンです。組み込みデバイス、モバイルデバイス、デスクトップアプリケーションで広く使用されています。
SQLite の機能は次のとおりです。
(1) 軽量: SQLite のコア ライブラリはわずか数百 KB であり、組み込みデバイスやモバイル デバイスなどのリソースに制約のある環境での使用に非常に適しています。
(2) ゼロ構成: SQLite は構成を必要とせず、ライブラリ ファイルをアプリケーションに埋め込むだけで済みます。
(3) サーバー側: SQLite をサーバー上で実行する必要はなく、すべてのデータはローカル ファイルに保存されます。
(4) 自己完結型: SQLite のすべての機能は、他のライブラリ ファイルに依存せず、別個のライブラリ ファイルに含まれています。
(5) ゼロ管理: SQLite はデータベース接続やトランザクションなどのステータスを維持する必要がなく、すべての操作が自動です。
(6) トランザクション: SQLite は、データの一貫性と信頼性を確保するために ACID トランザクションをサポートしています。
SQLite は、SELECT、INSERT、UPDATE、DELETE などの操作を含む標準 SQL ステートメントをサポートし、整数、浮動小数点数、文字列、日付などの複数のデータ型もサポートします。SQLite は、C、C++、Python、Java などの複数のプログラミング言語もサポートしており、さまざまなアプリケーションに簡単に統合できます。
Windows システムでは、次の手順に従って SQLite データベースをダウンロードしてインストールできます。
(1) SQLite の公式 Web サイトを開きます: https://www.sqlite.org/index.html
(2) ウェブサイト上部のメニューバーで「ダウンロード」をクリックし、ダウンロードページに入ります。
(3) ダウンロード ページには、利用可能なプリコンパイル済みバイナリがいくつか表示されます。Windows オペレーティング システムのビット数 (32 ビットまたは 64 ビット) とニーズに応じて、適切なバージョンを選択してください。
(4) 32 ビット システムの場合は、「Windows 用プリコンパイル済みバイナリ」セクションのファイルを直接sqlite-dll-win32-x86-*.zip
ダウンロードできます。sqlite-tools-win32-x86-*.zip
(5) 64 ビット システムの場合は、「Windows 用プリコンパイル済みバイナリ」セクションのファイルを直接sqlite-dll-win64-x64-*.zip
ダウンロードできます。sqlite-tools-win64-x64-*.zip
(6) ダウンロードが完了したら、sqlite-dll-win*.zip
ファイルを解凍してsqlite3.dll
ファイルを入手します。
(7) フォルダーを作成し (SQLite またはその他の好きな名前を付けます)、sqlite3.dll
ファイルをこのフォルダーにコピーします。
(8) 次に、sqlite-tools-win*.zip
ファイルを解凍して、 sqlite3.exe
、ファイルsqlite3_analyzer.exe
を含むツール ファイルのセットを取得しますsqlite3.def
。
(8) これらのツールファイルを、先ほど作成した SQLite フォルダーにコピーします。
2、SQLite 構文
SQLite は、標準の SQL 構文をサポートする軽量の組み込みデータベースです。
SQLite データベースのテーブルの作成、データの挿入、データの削除、データの更新、およびデータのクエリの構文を以下に 1 つずつ紹介します。
(1) テーブルを作成する
SQLite データベースにテーブルを作成するには、CREATE TABLE
次のステートメントを使用できます。構文は次のとおりです。
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
...
);
table_name
作成するテーブルの名前です。column1
、column2
などはテーブルの列名です。datatype
列のデータ型です。constraint
オプションであり、主キー、一意制約、外部キーなどの列制約を定義するために使用されます。
たとえば、id、名前、年齢の 3 つの列を持つ「students」というテーブルを作成します。
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
(2) データの挿入
SQLite データベースのテーブルにデータを挿入するには、INSERT INTO
ステートメントを使用できます。構文は次のとおりです。
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
table_name
データを挿入するテーブルの名前です。column1
、column2
などはテーブルの列名です。value1
、value2
などは、挿入される具体的な値です。
たとえば、「students」テーブルにデータを挿入するには、次のようにします。
INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);
(3) データの削除
SQLite データベースのテーブルからデータを削除するには、DELETE FROM
ステートメントを使用できます。構文は次のとおりです。
DELETE FROM table_name
WHERE condition;
table_name
データを削除するテーブルの名前です。condition
はオプションで、データを削除する条件を指定するために使用されます。
たとえば、ID 1 のデータを「students」テーブルから削除するには、次のようにします。
DELETE FROM students
WHERE id = 1;
(4) データ更新
SQLite データベース テーブル内のデータを更新するには、UPDATE
ステートメントを使用できます。構文は次のとおりです。
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
table_name
データを更新するテーブルの名前です。column1
、column2
などは更新する列名です。value1
、value2
などは更新される具体的な値です。condition
はオプションで、データを更新する条件を指定するために使用されます。
たとえば、「students」テーブルの ID 1 のデータの名前を「Li Si」に更新し、年齢を 22 に更新します。
UPDATE students
SET name = '李四', age = 22
WHERE id = 1;
(5) クエリデータ
SQLite データベース テーブルのデータをクエリするには、SELECT
ステートメントを使用できます。構文は次のとおりです。
SELECT column1, column2, ...
FROM table_name
WHERE condition;
column1
、などはクエリ対象の列名です。すべての列をクエリしたい場合は、代わりに記号をcolumn2
使用できます。*
table_name
データをクエリするテーブルの名前です。condition
これはオプションであり、データをクエリするための条件を指定するために使用されます。
たとえば、「students」テーブルのすべてのデータをクエリするには、次のようにします。
SELECT * FROM students;
3. 完全なコード
次の C 言語コードは、SQLite データベースの使用方法を示しています。
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
// 数据库文件名
const char* DB_FILE = "example.db";
// 回调函数,用于执行查询sql语句后的结果处理
int selectCallback(void* data, int argc, char** argv, char** azColName)
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
// 初始化数据库连接
sqlite3* initDatabase()
{
sqlite3* db;
int rc = sqlite3_open(DB_FILE, &db);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return NULL;
}
return db;
}
// 关闭数据库连接
void closeDatabase(sqlite3* db)
{
if (db)
{
sqlite3_close(db);
}
}
// 创建表
void createTable(sqlite3* db)
{
char* errMsg;
const char* createSql = "CREATE TABLE IF NOT EXISTS students (id INT PRIMARY KEY, name TEXT, age INT);";
int rc = sqlite3_exec(db, createSql, NULL, 0, &errMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法创建表: %s\n", errMsg);
sqlite3_free(errMsg);
}
else
{
printf("表创建成功\n");
}
}
// 插入数据
void insertData(sqlite3* db, int id, const char* name, int age)
{
char insertSql[100];
snprintf(insertSql, sizeof(insertSql), "INSERT INTO students (id, name, age) VALUES (%d, '%s', %d);", id, name, age);
char* errMsg;
int rc = sqlite3_exec(db, insertSql, NULL, 0, &errMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法插入数据: %s\n", errMsg);
sqlite3_free(errMsg);
}
else
{
printf("数据插入成功\n");
}
}
// 更新数据
void updateData(sqlite3* db, int id, const char* name, int age)
{
char updateSql[100];
snprintf(updateSql, sizeof(updateSql), "UPDATE students SET name = '%s', age = %d WHERE id = %d;", name, age, id);
char* errMsg;
int rc = sqlite3_exec(db, updateSql, NULL, 0, &errMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法更新数据: %s\n", errMsg);
sqlite3_free(errMsg);
}
else
{
printf("数据更新成功\n");
}
}
// 删除数据
void deleteData(sqlite3* db, int id)
{
char deleteSql[100];
snprintf(deleteSql, sizeof(deleteSql), "DELETE FROM students WHERE id = %d;", id);
char* errMsg;
int rc = sqlite3_exec(db, deleteSql, NULL, 0, &errMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法删除数据: %s\n", errMsg);
sqlite3_free(errMsg);
}
else
{
printf("数据删除成功\n");
}
}
// 查询数据
void selectData(sqlite3* db)
{
char* errMsg;
const char* selectSql = "SELECT * FROM students;";
int rc = sqlite3_exec(db, selectSql, selectCallback, 0, &errMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "无法查询数据: %s\n", errMsg);
sqlite3_free(errMsg);
}
}
int main()
{
sqlite3* db = initDatabase();
if (db)
{
createTable(db);
insertData(db, 1, "张三", 20);
insertData(db, 2, "李四", 22);
insertData(db, 3, "王五", 25);
selectData(db);
updateData(db, 1, "赵六", 23);
selectData(db);
deleteData(db, 3);
selectData(db);
closeDatabase(db);
}
return 0;
}
この例では、initDatabase
データベース接続が関数によって初期化され、createTable
「students」というテーブルが関数によって作成されます。次に、insertData
関数を使用してデータを挿入し、updateData
関数を使用してデータを更新し、deleteData
関数を使用してデータを削除し、関数selectData
を使用してデータをクエリし、selectCallback
コールバック関数を介してクエリ結果を処理します。