嵌入式sqlite3
一、sqlite3安装
1.本地安装
下载安装包,官网地址:http://www.sqlite.org/download.html
步骤如下:
$tar xvfz sqlite-autoconf-3071502.tar.gz $cd sqlite-autoconf-3071502 $./configure --prefix=/usr/local //指定安装目录 $make $make instal
2.在线安装
sudo apt-get install sqlite3
查看是否安装完成 sqlite3
在终端输入sqlite3是否显示如下内容:
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
使用中编译时出现: fatal error: sqlite3.h: 没有那个文件或目录
描述:找不到头文件
原因:系统没有安装函数库
解决办法:sudo apt-get install libsqlite3-dev
二、sqlite3数据库命令(重点)
1、系统命令,都以'.'开头
sqlite> help 打开帮助手册查看各种系统命令
.exit
.quit
.table 查看表
.schema 查看表的结构
2、sql语句,都以‘;’结尾
1.打开(创建)一个数据库(必须先创建一个数据库才能在数据库中建立表格)
sqlite3 xxx.db
2-- 在数据库中创建一张表
create table stuinfo(id integer, name text, age integer, score float);
3-- 插入一条记录
insert into stuinfo values(1001, 'zhangsan', 18, 80);
insert into stuinfo (id, name, score) values(1002, 'lisi', 90);
4-- 查看数据库记录
select * from stuinfo;(*通配表示所有数据)
select name,score from stuinfo;
查询指定的字段
where表示选取,and表示与(同时满足),or表示或
select * from stuinfo where score = 80;
select * from stuinfo where score = 80 and name= 'zhangsan';
select * from stuinfo where score = 80 or name='wangwu'
select * from stuinfo where score >= 85 and score < 90;
5-- 删除一条记录
delete from stuinfo where id=1003 and name='zhangsan';
6-- 更新一条记录
update stuinfo set age=20 where id=1003;
update stuinfo set age=30, score = 82 where id=1003;
7-- 删除一张表
删除整张表而不是某一条记录与delete区分
drop table stuinfo;
8-- 增加一列
alter table stuinfo add column sex char;
9-- 删除一列
因sqlite没有直接删除一列的功能,所以分三步,先新建一个数据库复制原来的数据库
(除去想要删除的那一列不复制)
然后删除原来的数据库,再把新建的数据库改名为原来的数据库,达到删除一列的目的。
create table stu as select id, name, score from stuinfo; /*创建新表*/
drop table stuinfo;/*删除原表*/
alter table stu rename to stuinfo;/*改名*/
数据库设置主键:
create table info(id integer primary key autoincrement, name vchar);
主键就是限制资料不重复的字段﹐设置为主键的字段(可多个字段一起做主键)﹐设了主键就限制了资料的唯一性。
例如在人事资料中有一个身份征号的字段﹐这个就可设为主键(因为身份征号不会重复),但姓名就 不可以,因为姓名可以重复。
另外设置了主键有利于提高数据的检索速度﹐也保证数据的准确性
3.sqlite3 数据库 C语言 API
1)创建(打开)数据库函数
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */(字符串或者数组名数据库的名字xxx.db格式)
sqlite3 **ppDb /* OUT: SQLite db handle */ (sqlite型的二级指针,传入sqlite *类型的地址)
);
功能:打开数据库
参数:filename 数据库名称
ppdb 数据库句柄
返回值:成功为0 (SQLITE_OK) ,出错 错误码
2)关闭数据库函数
int sqlite3_close(sqlite3* db);
功能:关闭数据库
参数:
返回值:成功为0 SQLITE_OK ,出错 错误码
3)打印错误信息函数
const char *sqlite3_errmsg(sqlite3*db);
功能:通过db指针,得到错误信息的描述,
返回值:错误信息首地址(用printf打印,类似于strerror函数)
4)数据库操作函数(重点)
Int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
功能:执行SQL操作
db:数据库句柄
sql:SQL语句(操作命令的字符串)
callback:回调函数(在查询功能是才调用回调函数,其他功能直接传NULL)
arg : 为回调函数传递参数
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
回调函数(查询使用):
Typedef int (*sqlite3_callback)(void *arg, int n, char **f_value, char **f_name);
功能:查询语句执行之后,会回调此函数,每找到一条记录自动执行一次回调函数
参数:arg 接收sqlite3_exec 传递来的参数,函数指针类型(函数名)
ncolumns 列数
f_value 列的值得地址,f_value[0]~f_value[f_ncolumns
f_name 列的名称
返回值:0,
5)查询(查找)数据库的另一种方法
不使用回调函数执行SQL语句
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针(类似于指针数组)
nrow:满足条件的记录的数目(行数,不包括标题栏)
ncolumn:每条记录包含的字段数目(列数)
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
示例代码:创建一个数据库,其中保存学生信息(学号id,姓名,年龄,性别,分数等等)
#include#include #include #include #define DATABASE "student.db" #define N 128 int do_insert(sqlite3 *db) { int id; char name[32] = {}; char sex; int score; char sql[N] = {}; char *errmsg; printf("Input id:"); scanf("%d", &id); printf("Input name:"); scanf("%s", name); getchar(); printf("Input sex:"); scanf("%c", &sex); printf("Input score:"); scanf("%d", &score); sprintf(sql, "insert into student values(%d, '%s', '%c', %d)", id, name, sex, score); if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) { printf("%s\n", errmsg); } else { printf("Insert done.\n"); } return 0; } int do_delete(sqlite3 *db) { int id; char sql[N] = {}; char *errmsg; printf("Input id:"); scanf("%d", &id); sprintf(sql, "delete from student where id = %d", id); if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) { printf("%s\n", errmsg); } else { printf("Delete done.\n"); } return 0; } int do_update(sqlite3 *db) { int id; char sql[N] = {}; int score; char *errmsg; printf("Input id:"); scanf("%d", &id); getchar(); printf("Update score:"); scanf("%d",&score); getchar(); sprintf(sql, "update student set score =%d where id=%d",score,id); if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) { printf("%s\n", errmsg); } else { printf("update done.\n"); } return 0; } /*f_value f_name 传出参数,肯定定义在了数据库的其他地方*/ int callback(void *arg, int f_num, char ** f_value, char ** f_name) { int i = 0; for(i = 0; i < f_num; i++) { // printf("%-8s %s", f_value[i], f_name[i]); printf("%-8s", f_value[i]); } printf("\n++++++++++++++++++++++"); putchar(10); return 0; } int do_query(sqlite3 *db) { char *errmsg; //char sql[N] = "select count(*) from stu where name='zhangsan';"; char sql[N]; sprintf(sql,"select *from student"); if(sqlite3_exec(db, sql, callback,NULL,&errmsg) != SQLITE_OK) { printf("%s", errmsg); } else { printf("select done.\n"); } return 0; } int do_query1(sqlite3 *db) { char *errmsg; char ** resultp; int nrow; int ncolumn; if(sqlite3_get_table(db, "select * from student", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK) { printf("%s\n", errmsg); return -1; } else { printf("query done.\n"); } int i = 0; int j = 0; int index = ncolumn;//跳过标题直接从数据开始打印 for(j = 0; j < ncolumn; j++) { printf("%-10s ", resultp[j]); } putchar(10); for(i = 0; i < nrow; i++) { for(j = 0; j < ncolumn; j++) { printf("%-10s ", resultp[index++]); } putchar(10); } return 0; } int main(int argc, const char *argv[]) { sqlite3 *db; char *errmsg; int n; if(sqlite3_open(DATABASE, &db) != SQLITE_OK) { printf("%s\n", sqlite3_errmsg(db)); return -1; } else { printf("open DATABASE success.\n"); } if(sqlite3_exec(db, "create table if not exists student(id int, name char , sex char , score int);", NULL, NULL, &errmsg) != SQLITE_OK) { printf("%s\n", errmsg); } else { printf("Create or open table success.\n"); } while(1) { printf("********************************************\n"); printf("1: insert 2:query 3:delete 4:update 5:quit\n"); printf("********************************************\n"); printf("Please select:"); scanf("%d", &n); switch(n) { case 1: do_insert(db); break; case 2: do_query(db); //do_query1(db); break; case 3: do_delete(db); break; case 4: do_update(db); break; case 5: printf("main exit.\n"); sqlite3_close(db); exit(0); break; default : printf("Invalid data n.\n"); } } return 0; }