1.SQLite简介
SQLite轻量化的关系型数据库,无服务器,是自包含的,数据库引擎作为应用程序的一部分运行。是嵌入式数据库的一种,用于设备端的数据管理,可以理解为单点的数据库。传统服务器型数据库用于管理多设备,更加复杂。
SQLite与mysql的区别
基于嵌入式的数据库主要有: SQLite, FIRebird ,Berkeley DB,extremeDB
2.SQLite数据库的安装
1.sudo apt-get install SQLite
2.官网下载
https://www.sqlite.org/download.html
然后通过MobaXterm上传到开发板上
1. 解压
tar xvf sqlite-autoconf-3410000.tar.gz
2.进入解压后的文件夹
3。指定安装路径
./configure PREFIX=/usr/local
4.编译
make
时间稍微有点久等待一下就好了
5.安装
sudo make install
此安装方式在Ubuntu中同样适用
这样就可以使用了
3.创建一个数据库
方式一:
sqlite3
.open test.db//打开,如果没有则创建
.quit//退出
方式二:
sqllite3 test.db
.database//看到已打开的数据库
.quit//退出
## 创建一张表
create table 表名 (字段1名称 类型,字段2名称 类型.....);//必须以分号结束
Integer 整型 char字符类型
.table显示表
## 在表中插入一条记录
insert into 目标表名称 values(数据1,数据2,数据3.....);//插入全部数据按照字段顺序填充
insert into 目标表名称(字段1,字段2...) values(字段1的值,字段2的值....);//插入部分数据
" "
insert into Stu values(001,"xiaowang",100);
insert into Stu values(002,"xiaoli",99);
insert into Stu(name,souce) values("wangba",100);
" "
## 查询记录
select * from 【表名】;
select [字段1] ,[字段2] from [表名] ;
" "
select * from Stu;
select name ,source from Stu;
" "
## 删除一条记录
delete from [表名] where [条件];
" "
delete from Stu where source = 66;
" "
## 删除一张表
drop table [表名];
" "
drop table Stu;
" "
## 更新一条记录
update [表名] set [字段名称] =[值] where [条件];
" "
update Stu set id=004 where name="zhangsan";
" "
## 给表添加一个字段
alter table [表名]add column [字段名,类型];
" "
alter table Stu add column sex char;
" "
4.C语言打开数据库
## 相关API
sqlite3_open(char *filename,sqlite3 **db)//filename数据库名 db sqlite 类型的二级指针存放数据库的连接对象
//该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
//返回值如果是SQLITE_OK 表示成功打开 返回值为14表示权限不够
sqlite3_close(sqlite3 *db);//关闭数据库
//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。并把错误返回给const char *sqlite3_errmsg(sqlite3 *db);
const char *sqlite3_errmsg(sqlite *db);//收集错误信息
返回值:
## 相关程序的编写
sqlite_open.c
#include <stdio.h>
#include <sqlite3.h>
int main(int argc,char **argv){
sqlite3 *db;
int ret;
if(argc<2){
printf("usage : %s xxx.db\n",argv[0]);
return -1;
}
if((ret=sqlite3_open(argv[1],&db))==SQLITE_OK){
printf("%s open success\n",argv[1]);
}
else{
printf("error: %s\n",sqlite3_errmsg(db));
if(ret==14){
printf("not have quanxian\n");
}
return -1;
}
sqlite3_close(db);
printf("done\n");
}
编译:gcc xx.c -lsqlite3
运行 ./a.out xxx.db
5.c语言执行sql语句
## 1.相关API
1.sql执行函数
int sqlite3_exec(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void * data, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
//db 打开的数据库对象
//sql SQL语句 SQL语句可以是多个
//sqlite_callback 回调函数
//data是回调函数callback()的第一个参数
//errmsg存放程序执行返回的任何错误
//执行成功返回0;
//sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
所谓 回调函数的意思是,会先执行*sql对应的功能命令,然后将结果传递给回调函数,回调函数根据结果再进一步执行。这代表着,这个 “回调函数”才是最有意义的,我们要讲我们需要的功能,通过回调函数来实现,不管是获取数据库表中有效信息,还是其他动作。
2.回调函数API
int callback(void *data, int column_size, char *column_value[], char
*column_name[])//获取数据库表中的信息
//data 为sqlite3_exec()的第四个参数
//column_size为字段的数量
//*column_value[]相当于一个二级指针 存放的是字段的值
//*column_name[]相当于一个二级指针,存放的是字段名称
//必须让其返回0 这样数据库中有几条数据回调函数就会被调用多少次
3.执行select语句
基于sqlite_open.c 编写
sqlite_exec_select.c
#include <stdio.h>
#include <sqlite3.h>
int callback(void *data, int column_size, char *column_value[], char*column_name[]){
int i;
printf("data=%s\n",(char *)data);
for(i=0;i<column_size;i++){//column_size字段的数量
printf("%s = %s\n",column_name[i],column_value[i]);
}
printf("======================\n");
return 0;//必须返回0, 这样数据库有多少数据回调函数就执行多少次
}
int main(int argc,char **argv){
sqlite3 *db;
int ret;
char *errMsg=NULL;
if(argc<2){
printf("Uasge : %s xxx.db\n",argv[0]);
return -1;//参数不完整就退出
}
if((ret=sqlite3_open(argv[1],&db))==SQLITE_OK){
printf("open %s success\n",argv[1]);
}else{
printf("error :%s\n",sqlite3_errmsg(db));//错误原因
if(ret==14){
printf(" don't have quanxian\n");//权限不够
}
return -1;//打不开就退出
}
//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
sqlite3_exec(db,"select * from Stu",callback,"connect of sql",&errMsg);
//此处可能发生段错误,原因: errMsg是野指针
sqlite3_close(db);
return 0;
}
4.创建表和插入数据
sqlite_exec_create.c
#include <stdio.h>
#include <sqlite3.h>
int callback(void *data, int column_size, char *column_value[], char*column_name[]){
int i;
printf("data = %s\n",(char *)data);
for(i=0;i<column_size;i++){
printf("%s = %s\n",column_name[i],column_value[i]);
}
printf("=======================\n");
return 0;//必须让其返回0 这样数据库中有多少条数据,回调函数就会被调用多少次。
}
int main(int argc,char **argv){
sqlite3 *db;
int ret;
char *errMsg=NULL;
if(argc<2){
printf("Usange : %s xxx.db\n",argv[0]);
return -1;
}
if((ret=sqlite3_open(argv[1],&db))==SQLITE_OK){
printf("open %s success\n",argv[1]);
}else{
printf("error : %s\n",sqlite3_errmsg(db));
if(ret==14){
printf("not have quanxian\n");
}
return -1;
}
// sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg
ret=sqlite3_exec(db,"create table Class01(id Integer,name char,score integer); ",callback,"connect of sql",&errMsg);
if(ret!=SQLITE_OK){//如果返回值不是SQLITE_OK表示表已存在
printf("ret=%d errMsg:%s\n",ret,errMsg);//print error mesage;
}
ret=sqlite3_exec(db,"insert into Class01 values(01,'xiaoli',60);",callback,"insert of sql",&errMsg);
//插入数据
if(ret!=0){//没有插入打印出错信息
printf("ret=%d errMsg:%s\n",ret,errMsg);
}
ret=sqlite3_exec(db,"select * from Class01;",callback,"select of sql",&errMsg);
if(ret!=0){//查询失败打印出错信息
printf("ret=%d errMsg: %s\n",ret,errMsg);
}
sqlite3_close(db);
printf("done\n");
return 0;
}