嵌入式设备中可以使用SQLite3吗?

嵌入式设备中可以使用SQLite3吗?

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数,掌握了就好。

一、常见的数据库

大型数据库(大型机)Oracle(亿级),中型数据库(分布式超大型)mysql(百万级),轻型数据库(嵌入式设备)sqlite(万级),访问数据库使用SQL语句,适用于所有的数据库。

二、安装SQLite3

有C环境就可以调用sqlite

2.1直接用命令安装

sudo apt-get update
sudo apt-get install sqlite3

2.2 直接编译源码

将源码拷贝到Ubuntu的非共享目录解压

嵌入式设备中可以使用SQLite3吗?

解压命令:

tar zvxf sqlite-autoconf-3380500.tar.gz

配置

cd sqlite-snapshot-201708031550
./configure --prefix=/home/gec/sqlite

编译

make        

安装

make install         

三、SQLite的使用

新建数据库文件
sqlite3 数据库文件的路径   //打开/创建
//比如:sqlite3 first.db

嵌入式设备中可以使用SQLite3吗?

3.1 基本操作命令

.exit/.quit -------- 退出数据库命令行
.help -------------- 帮助说明信息
.tables ------------ 查看当前数据库中所有的表

3.2 数据库访问的SQL语句

基本语法:

所有的SQL语句都以分号(;)结束
不区分大小写

3.3 新建表格

create table 表名(字段名1 字段类型1,字段名2 字段类型2,字段名3 字段类型3,...);
比如:
//创建一个stutbl的表,表中有3个字段
//分别是整数类型的学号id,字符串类型的name和整数类型的age
create table zhiguoxin(id int,name char[20],age int);
//不存在则创建
create table if not exists zhiguoxin(id int,name char[20],age int);
//如果希望表中某个字段的内容不重复,可以用unique修饰该字段
create table if not exists zhiguoxin(id int unique,name char[20],age int);

嵌入式设备中可以使用SQLite3吗?

3.4 删除表格

drop table 表名;
//drop table zhiguoxin;

3.5 往表格中插入数据

insert into 表名 values(字段值1,字段值2,字段值3,....);
//字段值如果是字符串,必须用''(单引号)括起来
比如:
insert into zhiguoxin values(1001,'刘尧',18);
insert into zhiguoxin values(1002,'聂衍文',19);
insert into zhiguoxin values(1003,'杨佳晨',20);
insert into zhiguoxin values(1004,'冯华阳',21);

嵌入式设备中可以使用SQLite3吗?

完成插入之后,zhiguoxin 的表格内容如下:

idnameage1001刘尧181002聂衍文191003杨佳晨201004冯华阳21

3.6 查询表中的数据

//查询表中的所有数据

select * from 表名;
//select * from zhiguoxin;

嵌入式设备中可以使用SQLite3吗?

3.7 查看数据库

可以把first.db数据库文件拷贝至windows下,使用SQLite Developer打开即可看到。SQLite Developer下载地址

https://mydown.yesky.com/pcsoft/443425.html

嵌入式设备中可以使用SQLite3吗?

3.8 按条件查找

1.使用where指定查询条件

select * from zhiguoxin where id=1003;//查询id值为1003的条目
select&#xA0;*&#xA0;from&#xA0;zhiguoxin&#xA0;where&#xA0;age>=19&#xA0;and&#xA0;age<21; select * from zhiguoxin where age>=19&#xA0;or&#xA0;age<21; < code></21;></21;>

嵌入式设备中可以使用SQLite3吗?

2.指定查询的字段

select&#xA0;id,name,age&#xA0;from&#xA0;zhiguoxin;//&#x53EA;&#x67E5;&#x8BE2;id,name,age&#x7684;&#x5B57;&#x6BB5;&#xA0;

嵌入式设备中可以使用SQLite3吗?

3.使用where+like实现模糊查询

select&#xA0;*&#xA0;from&#xA0;zhiguoxin&#xA0;where&#xA0;name&#xA0;like&#xA0;'&#x5218;%';//&#x67E5;&#x627E;&#x540D;&#x5B57;&#x4EE5;&#x5218;&#x5F00;&#x5934;&#x7684;&#x6761;&#x76EE;

嵌入式设备中可以使用SQLite3吗?

4.使用order by实现查询结果按某个字段的值升序/降序输出

select&#xA0;*&#xA0;from&#xA0;zhiguoxin&#xA0;order&#xA0;by&#xA0;age&#xA0;desc;//&#x6309;&#x5E74;&#x9F84;&#x964D;&#x5E8F;&#x6392;&#x5E8F;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;
select&#xA0;*&#xA0;from&#xA0;zhiguoxin&#xA0;order&#xA0;by&#xA0;id&#xA0;asc;&#xA0;&#xA0;//&#x6309;id&#x5347;&#x5E8F;&#x6392;&#x5E8F;&#xA0;&#xA0;&#xA0;

嵌入式设备中可以使用SQLite3吗?

3.9 删除表中的条目

delete&#xA0;from&#xA0;&#x8868;&#x540D;&#xA0;where&#xA0;&#x6761;&#x4EF6;;//&#x5220;&#x9664;&#x6240;&#x6709;&#x7B26;&#x5408;&#x6761;&#x4EF6;&#x7684;&#x6761;&#x76EE;
&#x6BD4;&#x5982;&#xFF1A;
delete&#xA0;from&#xA0;zhiguoxin&#xA0;where&#xA0;id=1001;

嵌入式设备中可以使用SQLite3吗?

3.10 更新(修改)表中的条目

update&#xA0;&#x8868;&#x540D;&#xA0;set&#xA0;&#x5B57;&#x6BB5;&#x540D;1=&#x5B57;&#x6BB5;&#x503C;1,&#x5B57;&#x6BB5;&#x540D;2=&#x5B57;&#x6BB5;&#x503C;2...&#xA0;where&#xA0;&#x6761;&#x4EF6;;//&#x4FEE;&#x6539;&#x7B26;&#x5408;&#x6761;&#x4EF6;&#x7684;&#x6761;&#x76EE;
&#x6BD4;&#x5982;&#xFF1A;
update&#xA0;zhiguoxin&#xA0;set&#xA0;age=100&#xA0;where&#xA0;id=1002;

嵌入式设备中可以使用SQLite3吗?

3.11 SQLite中字段类型

数字:

int&#xA0;-------&#xA0;&#x6574;&#x578B;
smallint&#xA0;----&#xA0;&#x77ED;&#x6574;&#x578B;
tinyint&#xA0;-----&#xA0;&#x5FAE;&#x578B;&#x6574;&#x6570;(0~255)
bit&#xA0;---------&#xA0;0&#xA0;or&#xA0;1
float&#xA0;------&#xA0;&#x5355;&#x7CBE;&#x5EA6;&#x6D6E;&#x70B9;&#x578B;
real&#xA0;-------&#xA0;&#x53CC;&#x7CBE;&#x5EA6;&#x6D6E;&#x70B9;&#x578B;

字符串:

char&#xA0;----------&#xA0;&#x975E;unicode&#x5B9A;&#x957F;&#x5B57;&#x7B26;&#x4E32;&#xA0;< 8000 varchar ------- 非unicode变长字符串 < 8000 text ---------- 非unicode变长字符串 < 2^32-1 nchar ---------- unicode定长字符串 < 8000 nvarchar ------- unicode变长字符串 < 8000 ntext ---------- unicode变长字符串 < 2^32-1 < code></ 8000>

四、SQLite的C语言访问接口

sqlite本身自带C语言访问接口,在C语言的环境下可以直接使用,使用这些接口的代码需要 sqlite的源码编译进可执行程序 或者 编译时链接sqlite的库。

4.1 打开 sqlite3_open

int&#xA0;sqlite3_open(
&#xA0;&#xA0;const&#xA0;char&#xA0;*filename,&#xA0;&#xA0;&#xA0;/*&#xA0;&#x6570;&#x636E;&#x5E93;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xA0;*/
&#xA0;&#xA0;sqlite3&#xA0;**ppDb&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/*&#xA0;&#x8F93;&#x51FA;&#x53C2;&#x6570;&#xFF1A;&#x4F20;&#x51FA;&#x4EE3;&#x8868;&#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#x7684;&#x53E5;&#x67C4;&#xA0;*/
);
//&#x6210;&#x529F;&#x8FD4;&#x56DE;SQLITE_OK,&#x5426;&#x5219;&#x6253;&#x5F00;&#x5931;&#x8D25;char ----------&#xA0;&#x975E;unicode&#x5B9A;&#x957F;&#x5B57;&#x7B26;&#x4E32;&#xA0;< 8000
varchar &#xFF1A;&#x975E;unicode&#x53D8;&#x957F;&#x5B57;&#x7B26;&#x4E32;&#xA0;< 8000 text :非unicode变长字符串 < 2^32-1 nchar:unicode定长字符串 < 8000 nvarchar : unicode变长字符串 < 8000 ntext :unicode变长字符串 < 2^32-1 < code></ 8000>

4.2 关闭 sqlite3_close

int&#xA0;sqlite3_close(sqlite3&#xA0;*pDb);
//&#x4F20;&#x5165;&#x8981;&#x5173;&#x95ED;&#x7684;&#x6570;&#x636E;&#x5E93;&#x7684;&#x53E5;&#x67C4;

4.3 编译方法

1.&#x76F4;&#x63A5;&#x7F16;&#x8BD1;&#x6E90;&#x7801;
gcc&#xA0;sqlite3.c&#xA0;sqlite_test.c&#xA0;-pthread&#xA0;-ldl&#xA0;-o&#xA0;sqlite_test
2.&#x94FE;&#x63A5;sqlite3&#x7684;&#x52A8;&#x6001;&#x5E93;
gcc&#xA0;sqlite_test.c&#xA0;-pthread&#xA0;-ldl&#xA0;-lsqlite3&#xA0;-L&#xA0;/home/gec/sqlite/lib&#xA0;-o&#xA0;sqlite_test&#xA0;&#xA0;
//&#x5982;&#x679C;&#x8FD0;&#x884C;&#x65F6;&#x627E;&#x4E0D;&#x5230;sqlite3&#x7684;&#x5E93;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x7F16;&#x8BD1;&#x51FA;&#x6765;&#x7684;&#x5E93;&#x6587;&#x4EF6;&#x62F7;&#x8D1D;&#x5230;/usr/lib&#x76EE;&#x5F55;&#x4E0B;(cp&#xA0;-r)&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;

4.4 执行SQL语句的接口 sqlite3_exec

int&#xA0;sqlite3_exec(
&#xA0;&#xA0;sqlite3&#xA0;*pDb,&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/*&#xA0;&#x6253;&#x5F00;&#x7684;&#x6570;&#x636E;&#x5E93;&#x7684;&#x53E5;&#x67C4;&#xA0;*/
&#xA0;&#xA0;const&#xA0;char&#xA0;*sql,&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/*&#xA0;&#x8981;&#x6267;&#x884C;&#x7684;SQL&#x8BED;&#x53E5;&#xA0;*/
&#xA0;&#xA0;int&#xA0;(*callback)(void&#xA0;*arg,int&#xA0;col,char&#xA0;**str,char&#xA0;**name),&#xA0;&#xA0;
&#xA0;&#xA0;/*&#xA0;&#x56DE;&#x8C03;&#x51FD;&#x6570;,&#x5904;&#x7406;SQL&#x8BED;&#x53E5;&#x6267;&#x884C;&#x8FD4;&#x56DE;&#x7684;&#x7ED3;&#x679C;(&#x67E5;&#x8BE2;),&#x4E00;&#x6761;&#x7ED3;&#x679C;&#x8C03;&#x7528;&#x4E00;&#x6B21;&#xA0;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;arg&#xA0;-&#xA0;exec&#x7684;&#x7B2C;&#x56DB;&#x4E2A;&#x53C2;&#x6570;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;col&#xA0;-&#xA0;&#x672C;&#x6761;&#x7ED3;&#x679C;&#x7684;&#x5B57;&#x6BB5;&#x6570;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;str&#xA0;-&#xA0;&#x8BB0;&#x5F55;&#x5B57;&#x6BB5;&#x503C;&#x7684;&#x6570;&#x7EC4;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name&#xA0;-&#xA0;&#x8BB0;&#x5F55;&#x5B57;&#x6BB5;&#x540D;&#x7684;&#x6570;&#x7EC4;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5FC5;&#x987B;&#x8FD4;&#x56DE;SQLITE_OK&#xA0;*/
&#xA0;&#xA0;void&#xA0;*arg,&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/*&#xA0;&#x4F20;&#x9012;&#x7ED9;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#xA0;*/
&#xA0;&#xA0;char&#xA0;**errmsg&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;/*&#xA0;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xA0;*/
);
//&#x6210;&#x529F;&#x8FD4;&#x56DE;SQLITE_OK,&#x5426;&#x5219;&#x6267;&#x884C;&#x5931;&#x8D25;

几个例子

//&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;
int&#xA0;Connection_Sqlite3DataBase()
{
&#xA0;&#xA0;&#xA0;&#xA0;rc&#xA0;=&#xA0;sqlite3_open("./face_database/face.db",&#xA0;&db);
&#xA0;&#xA0;&#xA0;&#xA0;if&#xA0;(rc&#xA0;!=&#xA0;SQLITE_OK)
&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;fprintf(stderr,&#xA0;"Can't&#xA0;open&#xA0;database:&#xA0;%s\n",&#xA0;sqlite3_errmsg(db));
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_close(db);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;exit(1);
&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;else
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;printf("You&#xA0;have&#xA0;opened&#xA0;a&#xA0;sqlite3&#xA0;database&#xA0;named&#xA0;bind.db&#xA0;successfully!\nCongratulation!&#xA0;Have&#xA0;fun!\n");
&#xA0;&#xA0;&#xA0;&#xA0;return&#xA0;0;
}
//&#x5C06;&#x56FE;&#x7247;&#x63D2;&#x5165;&#x5230;&#x6570;&#x636E;&#x5E93;
void&#xA0;insert_face_data_toDataBase(const&#xA0;char&#xA0;*name,&#xA0;MByte&#xA0;*face_feature,&#xA0;MInt32&#xA0;featureSize)
{
&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_prepare(db,&#xA0;"insert&#xA0;into&#xA0;face_data_table(name,face_feature,feature_size)&#xA0;values&#xA0;(?,?,?);",&#xA0;-1,&#xA0;&stmt,&#xA0;NULL);
&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_bind_text(stmt,&#xA0;1,&#xA0;name,&#xA0;strlen(name),&#xA0;NULL);
&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_bind_blob(stmt,&#xA0;2,&#xA0;face_feature,&#xA0;featureSize,&#xA0;NULL);
&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_bind_int(stmt,&#xA0;3,&#xA0;featureSize);
&#xA0;&#xA0;&#xA0;&#xA0;sqlite3_step(stmt);
}

嵌入式设备中可以使用SQLite3吗?

end

Original: https://blog.csdn.net/weixin_41114301/article/details/128663097
Author: ST小智
Title: 嵌入式设备中可以使用SQLite3吗?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815183/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球