什么是SQLite
SQLite是一个c语言库,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎,也是世界上使用最多的数据库引擎(大名鼎鼎的安卓内置的数据库就是SQLite)。
重要的是SQLite的开发人员承诺到2050年,SQLite文件格式是稳定的、跨平台的、向后兼容的,所以完全可以放心使用了。
本文概述
主要将介绍在嵌入式Linux中如何移植并使用SQLite数据库完成简单的增、删、改、查的功能(命令行和C语言)。
SQLite的移植
- 因为嵌入式Linux运行环境不确定,编译器不确定,所以选择下载源码安装,本文是在Ubuntu下对SQLite3进行编译、运行的(嵌入式Linux是一样的)。SQLite3下载地址
- 我这里下载的是:sqlite-autoconf-3470000.tar.gz
- 在Ubuntu中使用命令解压源码:
tar -zxvf sqlite-autoconf-3470000.tar.gz
- 进入解压后的目录执行命令:
./configure --host=xxx_compilation_toolchain --prefix=xxx_install_pathname
,其中host指定你的编译器(如果要在嵌入式板子上运行,一般是交叉编译工具链),prefix指定安装目录(最好使用绝对路径)。 - 然后执行
make
、make install
- 将xxx_install_pathname目录中的bin中的拷贝到目标运行环境的/bin目录中,将xxx_install_pathname目录中的lib拷贝到目标目录的lib中,这样你就可以执行sqlite3进入数据库的命令行啦
SQLite使用
命令行下的使用方法
一般我们在最终的使用中很少去用命令行操作,但是我们在调试、测试等某些特定场合还是很好用的,这里以执行整个数据库完成增删改查功能来演示。
1、打开/创建数据库
.open test.db
2、创建表
语法:
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
我这里增加两个表tab1和tab2,tab1中包括了一个int类型id表示编号,int类型的age表示年龄,char类型的name表示姓名;tab2中包括了一个int类型id表示编号,char类型的name表示姓名:
create table tab1 (id int,age int,name char);
create table tab2 (id int,name char);
3、往表中增加数据
语法:
插入全部数据:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
指定表项插入:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);
这里我往表tab1、tab2里增加了若干:
insert into tab1 values(1,23,'张三');
insert into tab1 (id,age,name)values(2,20,'李四');
insert into tab1 (id,name)values(3,'李四一');
insert into tab2 values(1,'王五');
insert into tab2 values(2,'陈六');
还有其它插入技巧,本文不做演示,如:
从tab2中插入数据到tab1:
INSERT INTO tab1 [(column1, column2, ... columnN)] SELECT column1, column2, ...columnN FROM tab2 [WHERE condition];
4、删除表中信息
语法:
DELETE FROM table_name WHERE [condition];
可以根据成员内容删除,如:
#删除tab1的李四
delete from tab1 where id=2;
#删除tab2中的陈六
delete from tab2 where name='陈六';
注:如果想要删除表中所有内容,则不需要使用where子句,本文不做演示,如:
delete from tab1
5、改动表的信息
语法:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
可以根据表中信息来改动,如:
update tab1 set age=22 where id=3;
update tab2 set id=2 where name='王五';
6、查阅表的信息
语法:
SELECT column1, column2, columnN FROM table_name;
在前面的演示中,其实已经多次用到了:
#查看tab1所有数据
select * from tab1;
#查看表tab1中的id数据
select id from tab1;
7、关闭数据库
.exit 或.quit
8、其他常用命令,上面可能都已经用到了
.databases查看数据库信息
.schema查看所有表信息
C语言下的使用方法
1、主要接口
/*
作用:打开一个新的数据库连接
参数1:需要打开的数据库;
参数2:数据库操作句柄,通过此句柄可操作数据库
返回值:SQLITE_OK打开成功,非SQLITE_OK打开失败
*/
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
/*
作用:关闭数据库连接
参数:需要关闭的数据库操作句柄
返回值:SQLITE_OK关闭成功,非SQLITE_OK关闭失败
*/
int sqlite3_close(sqlite3 *);
/*
作用:执行sql语句
参数1:数据库操作句柄
参数2:要执行的sql语句
参数3:回调函数,执行完sql语句后会调用这个函数(为NULL不执行)
参数4:回调函数的第一个参数
参数5:错误信息
返回值:SQLITE_OK关闭成功,非SQLITE_OK关闭失败
*/
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
/*
作用:执行sql后回调
参数1:表示sqlite3_exec时传入的第四个参数
参数2:本条记录有多少字段
参数3:该字段的值
参数4:跟参数3对应,该字段的名称
*/
int (*callback)(void*,int,char**,char**)
2、本文以一个示例来演示SQLite在C语言下的使用
目标功能:实现一个图书馆管理系统,管理员可以上架和下架书籍,可实现自动或者手动编号;阅读者可以购买书籍,购买后库存会根据购买数量减少;如果不存在数据库文件还会自动创建。
作者声明:本程序只是一个示例程序,目的是为了更方便的演示SQLite的C语言接口的使用,不可避免的会有漏洞、考虑不周、编码不规范的地方,敬请谅解。
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/*
作用:执行sql后回调
参数1:表示sqlite3_exec时传入的第四个参数
参数2:本条记录有多少字段
参数3:该字段的值
参数4:跟参数3对应,该字段的名称
返回值:调用者使用
*/
static int callback(void *info, int argc, char **argv, char **azColName)
{
for(int i=0; i<argc; i++)
{
printf("\t%s:%s\t", azColName[i], argv[i] ? argv[i] : "NULL");
//这个需要获取count look_appoint_book用
if((info != NULL) && (strcmp(azColName[i], "count") == 0))
{
*((int*)info) = atoi(argv[i]);
}
//这个需要获取id get_last_book_id用
if((info != NULL) && (strcmp(azColName[i], "id") == 0