orangepizero2嵌入式数据库SQLite

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值