SQLite 是一个开源的、内嵌式的关系型数据库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是轻量级的开源数据库,广泛应用于消费电子、工业控制、医疗等各种领域。
在 Linux 上安装 SQLite
在 C/C++ 程序中使用 SQLite 之前,我们需要确保机器上是否已经有 SQLite 库。只要使用下面的命令来检查您的机器上是否已经安装了 SQLite
如果没有看到上面的结果,那么就意味着没有在 Linux 机器上安装 SQLite
,因此需要去官网上下载然后安装即可。或者在终端上直接输入命令,安装命令如下:
sudo apt-get install sqlite3
CentOS系统就默认安装了sqlite3,打开终端,输入以下命令可以查看sqlite3
这里需要说明一下,如果不是用 .exit 和 .quit 这两个命令退出,我们对数据库的修改有可能丢失。
sqllite数据库的命令
查看数据库信息
sqlite>.database
没有创建表,所以是空的。
查看所有表
sqlite>.table
查看所有表的创建语句
sqlite>.schema
查看某个表的创建语句
sqlite>.schema table_name
最重要的一个命令,执行sql语句(必须以分号结尾,不加分号就敲回车则是分行)
sqlite>select * from table_name;
退出命令
sqlite>.quit
SQLite - C的API接口
打开数据库
sqlite3_open(const char *filename, sqlite3 **ppDb)
功能:打开数据库
参数:
filename:数据库文件名,若文件名包含 ASCII 码表范围的之外的字符,则其必需是(UTF-8)编码。
ppDb:数据库标识,此结构体为数据库操作句柄。通过此句柄可对数据库文件进行相应操作。
返回值:成功返回 SQLITE_OK,失败返回非 SQLITE_OK。
关闭数据库
sqlite3_close(sqlite3 *ppDb)
功能:关闭数据库、释放打开数据库时申请的资源。
参数:ppDb是数据库的标识。
返回值:成功返回 SQLITE_OK。失败返回非 SQLITE_OK。
数据库回调方法
sqlite3_exec(sqlite3* qqDb, const char *sql, exechandler_t callback, void *data, char **errmsg)
功能:执行 sql 指向的 SQL 语句,若结果集不为空,函数会调用函数指针 callback 所指向的函数。
参数:
qqDb:数据库的标识。
sql:SQL 语句(一条或多条),以’;’结尾。
callback:是回调函数指针,当这条语句执行之后,sqlite3 会去调用你提供的这个函数。
arg:当执行 sqlite3_exec 的时候传递给回调函数的参数。
errmsg:存放错误信息的地址,执行失败后可以查阅这个指针。
回调函数指针
让我们先了解下回调函数的一些细节,这将在我们的实例使用到。这个回调提供了一个从 SELECT 语句获得结果的方式。它声明如下:
typedef int (*sqlite3_callback)(
void*, /* sqlite3_exec()的第4个参数提供的数据 */
int, /* 行中的列数*/
char**, /* 表示行中字段的字符串数组*/
char** /*表示列名的字符串数组*/
);
连接数据库
下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./stu_info.db"
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK)
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
sqlite3_close(db);
return 0;
}
从官网下载sqlite3文件,然后在当前程序目录下放sqlite3.c和sqlite3.h文件。
创建数据库表
下面的 C 代码段将用于在先前创建的数据库中创建一个表:
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
static int callback(void * para, int n_column,
char **column_value, char **column_name)
{
int i = 0;
printf("para= %d\n",*((int *)para)); //sqlite3_exec 传给此函数的参数
for (i = 0; i < n_column; i++) //结果集的列数
{
printf("column_value = %s \t column_name = %s \n",column_value[i],column_name[i]);
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
char *sql;
char *zErrMsg = 0;
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表
sql = "CREATE TABLE COMPANY(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME TEXT NOT NULL," \
"AGE INT NOT NULL," \
"ADDRESS CHAR(50)," \
"SALARY REAL );";
if ((ret = sqlite3_exec(db,sql,callback,0,&zErrMsg)) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("Table create successfully\n");
}
sqlite3_close(db);
return 0;
}
编译结果
可以看出编译的结果是打开成功,创建数据库表成功,可以用sqlitebrowser图形界面查看是否真的创建数据库成功。
INSERT 操作
在原先的数据库上插入数据。
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
static int callback(void * para, int n_column,
char **column_value, char **column_name)
{
int i = 0;
for (i = 0; i < n_column; i++) //结果集的列数
{
printf("column_value = %s \t column_name = %s \n",column_value[i],column_name[i]);
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
char *sql;
char *zErrMsg = 0;
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表,插入数据
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (1, 'Paul', 111, 'California', 20000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (2, 'Allen', 222, 'Texas', 15000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (3, 'Teddy', 333, 'Norway', 20000.00 );" \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (4, 'Mark', 444, 'Rich-Mond ', 65000.00 );";
if ((ret = sqlite3_exec(db,sql,callback,0,&zErrMsg)) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("Table create successfully\n");
}
sqlite3_close(db);
return 0;
}
插入数据如下图:
SELECT 操作
下面的 C 代码段显示了如何从前面创建的 COMPANY 表中获取并显示记录
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
static int callback(void * para, int n_column,
char **column_value, char **column_name)
{
int i = 0;
printf("para= %s\n",(const char *)para); //sqlite3_exec 传给此函数的参数
for (i = 0; i < n_column; i++) //结果集的列数
{
printf("column_value = %s \t column_name = %s \n",column_value[i],column_name[i]);
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
char *sql;
char *zErrMsg = 0;
const char *test = "Sqlite3 database learning";
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表,插入数据
sql = "SELECT * from COMPANY";
if ((ret = sqlite3_exec(db,sql,callback,(void*)test,&zErrMsg)) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("Table create successfully\n");
}
sqlite3_close(db);
return 0;
}
输出结果:
UPDATE 操作
下面的 C 代码段显示了如何从前面创建的 COMPANY 表中更新并显示记录:
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
static int callback(void * para, int n_column,
char **column_value, char **column_name)
{
int i = 0;
printf("para= %s\n",(const char *)para); //sqlite3_exec 传给此函数的参数
for (i = 0; i < n_column; i++) //结果集的列数
{
printf("column_value = %s \t column_name = %s \n",column_value[i],column_name[i]);
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
char *sql;
char *zErrMsg = 0;
const char *test = "Sqlite3 database learning";
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表,更新ID为2的数据
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=2; " \
"SELECT * from COMPANY";
if ((ret = sqlite3_exec(db,sql,callback,(void*)test,&zErrMsg)) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("Table create successfully\n");
}
sqlite3_close(db);
return 0;
}
输出结果:
输出结果可以看出,值已经改变,再看看数据库是否真的改变呢!
DELETE 操作
下面的 C 代码段显示了如何使用 DELETE 语句删除任何记录,然后从 COMPANY 表中获取并显示剩余的记录:
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
static int callback(void * para, int n_column,
char **column_value, char **column_name)
{
int i = 0;
printf("para= %s\n",(const char *)para); //sqlite3_exec 传给此函数的参数
for (i = 0; i < n_column; i++) //结果集的列数
{
printf("column_value = %s \t column_name = %s \n",column_value[i],column_name[i]);
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
int ret = 0;
char *sql;
char *zErrMsg = 0;
const char *test = "Sqlite3 database learning";
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表,更新ID为2的数据
sql = "DELETE from COMPANY where ID=2; " \
"SELECT * from COMPANY";
if ((ret = sqlite3_exec(db,sql,callback,(void*)test,&zErrMsg)) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("Table create successfully\n");
}
sqlite3_close(db);
return 0;
}
输出结果:
总结
本文主要调用 sqlite3 的C/C++的API函数接口去创建数据库、创建表格、并插入数据、删除数据。
大家都会问为什么要使用sqlite3? 由于sqlite属于轻量级的数据库,不需要配置,不需要安装,也不需要管理员,所以也就没必要像操作mysql等数据库一样的设置主机,用户和密码了。使用起来很方便。sqlite3源代码量也不多。有兴趣的很有,可以去Look一下源码。麻雀虽小,五脏俱全。