第七篇 嵌入式数据库SQLite

目录

 一、SQLite数据库简介

 二、安装SQLite3数据库(ubuntu20.04下)

方式一:直接下载安装

方式二:源码包编译安装

三、SQLite基础操作(Linux)

1.SQLite下的点命令

🔖打开/创建数据库.open

🔖查看数据库中所有表.table

🔖输出模式.mode 

🔖帮助信息.help

2.SQL基本语句操作表

🔖创建表、删除表

🔖向表中增加数据(增)

🔖删除表中的数据(删)

🔖修改表中的数据(改)

🔖查询表中的数据(查)

四、SQLite的C编程

1.打开数据库sqlite3_open

2.关闭数据库sqlite3_close

3.执行SQL语句sqlite3_exec

4.(重要)回调函数callback 

五、C操作SQLite数据库

1.Demo1.c(执行select * from student.db)

2.Demo2.c(在demo1的基础上,将数据存在链表中)

3.Demo3.c(创建表,并插入数据)


本篇浅学嵌入式数据库SQLite,关于SQLite的详细教程可参考:SQLite教程丨菜鸟教程

 一、SQLite数据库简介

        SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL 数据库引擎,也称嵌入式数据库。它是一个零配置的数据库,这意味着与其他数据库不一样,不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,作为应用程序一部分运行,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件

(MySQL需要运行服务器,需要服务器和客户端通过网络交互)

SQLite

MySQL

优点

  • 基于文件,易于设置和使用
  • 适合基础开发和测试。
  • 使用标准SQL语法(仅有微小更改)
  • 良好的安全功能,易于扩展
  • 适用于大型数据库
  • 速度和性能良好
  • 提供较为全面的用户管理和多种访问控制

缺点

  • 缺乏用户管理和安全功能
  • 不适合应用在大型数据库
  • 不易于扩展,无法定制
  • 非零配置数据库
  • 与传统SQL语法略不同

此外,基于嵌入式的数据库还有:Firebird、Berkeley DB、eXtreme DB

🔖SQLite是关系型数据库,体积小支持ACID事务

🔖Firebird是关系型数据库,支持存储过程,SQL兼容

🔖Berkeley DB没有数据库服务器概念,程序直接链接到应用程序

🔖eXtreme DB内存数据库,运行速度快

 二、安装SQLite3数据库(ubuntu20.04下)

方式一:直接下载安装

(可能会出现安装不了SQLite3,可以改用第二种安装)

root@ubuntu:~# sudo apt-get install sqlite3

方式二:源码包编译安装

SQLite3官网下载链接

这里下载的是最新版sqlite-autoconf-3390100.tar.gz

(从官网下载好SQLite3的压缩包后,解压后开始进行编译和安装)

Step1:解压源码包 tar -zxvf sqlite-autoconf-3390100.tar.gz 
Step2:进入源码包主目录 cd sqlite-autoconf-3390100/
Step3:配置安装路径 ./configure --prefix=/usr/local
Step4:编译 make
Step5:安装 make install

大部分第三方源码包的安装方法

三、SQLite基础操作(Linux)

1.SQLite下的点命令

(SQLite下嵌入了简单实用的命令,不同于SQL语句,这些命令不以;结尾。提供了查看、创建数据库等操作的功能,如.open student.db打开student数据库。这样的命令也称为点命令)

🔖打开/创建数据库.open

.open+databasename.db   打开数据库,不存在就创建

.database  查看所有数据库信息

sqlite> .open student.db
sqlite> .database
main: /root/student.db r/w
sqlite> 

🔖查看数据库中所有表.table

sqlite> .table
stu_Info      teacher_info
sqlite> 

🔖输出模式.mode 

.mode column    显示表头字段

sqlite> .mode column
sqlite> select * from stu_Info;
ID  name      age  register
--  --------  ---  --------
1   zhangsan  18           
2   lisi      19   1  

🔖帮助信息.help

sqlite> .help
.archive ...             Manage SQL archives
.auth ON|OFF             Show authorizer callbacks
.echo on|off             Turn command echo on or off
sqlite> 
(这里只截取了几条 .help会列出所有点命令的使用帮助)

2.SQL基本语句操作表

🔖创建表、删除表

例:创建学生信息表,包含字段有学号ID、姓名name、年龄age、注册信息register

sqlite> create table stu_Info (ID int,name char,age int,register bool);
sqlite>

🔖向表中增加数据(增)

例1:向表中写入学生王五(3,19,已注册)的数据

sqlite> insert into stu_Info values(3,"wangwu",19,1);
sqlite> select * from stu_Info;
ID  name      age  register
--  --------  ---  --------
1   zhangsan  18           
2   lisi      19   1       
3   wangwu    19   1       
sqlite>

例2:向表中写入学生小明(已知小明的学号4)的数据

sqlite> insert into stu_Info(ID,name) 
values(4,"xiaoming");
sqlite> select * from stu_Info;
ID  name      age  register
--  --------  ---  --------
1   zhangsan  18           
2   lisi      19   1       
3   wangwu    19   1       
4   xiaoming               
sqlite> 

🔖删除表中的数据(删)

例:删除学生信息表中没有注册的学生信息

sqlite> delete from stu_Info where register is NULL 
sqlite> select * from stu_Info;
ID  name    age  register
--  ------  ---  --------
2   lisi    19   1       
3   wangwu  19   1       
sqlite> 

🔖修改表中的数据(改)

例:将wangwu的年龄修改为20岁

sqlite> update stu_Info set age=20 where name="wangwu";
sqlite> select  * from stu_Info;
ID  name    age  register
--  ------  ---  --------
2   lisi    19   1       
3   wangwu  20   1       
sqlite> 

🔖查询表中的数据(查)

例1:查询表中所有学生数据

sqlite> .mode column
sqlite> select * from stu_Info;
ID  name      age  register
--  --------  ---  --------
1   zhangsan  18           
2   lisi      19   1  

例2:查询表中所有学生的姓名和年龄

sqlite> select name,age from stu_Info;
name      age
--------  ---
zhangsan  18 
lisi      19 
sqlite> 

例3:查询未注册的学生信息

sqlite> select * from stu_Info where register is NULL;
ID  name      age  register
--  --------  ---  --------
1   zhangsan  18           
sqlite> 

四、SQLite的C编程

        在C/C++程序中使用SQLite之前,需要确保机器上已经有SQLite库。在编译程序时需要加选项-lsqlite3链接到SQLite的库。

1.打开数据库sqlite3_open

✒️函数原型int sqlite3_open(const char *zFilename,sqlite3 **ppDb);

✒️参数说明:①zFilename:打开的数据库名(如:student.db,不为NULL将以附加的方式打开该数据库,如果为NULL,会在RAM中创建一个只在当前会话有效的临时内存数据库。

②ppDb:指向操作数据库的句柄的地址

✒️返回值:0-28和100-101表示执行状态的整数(以下是对应的宏定义)


2.关闭数据库sqlite3_close

✒️函数原型int sqlite3_close(sqlite3 *db);

✒️参数说明:db 关闭数据库的操作句柄

✒️返回值:同上0-28和100-101表示执行状态的整数 


3.执行SQL语句sqlite3_exec

 ✒️函数原型:

SQLITE_API int sqlite3_exec(

  sqlite3 *db,     /* The database on which the SQL executes */

  const char *zSql,            /* The SQL to be executed */

  sqlite3_callback xCallback, /*Invoke this callback routine*/

  void *pArg,               /* First argument to xCallback() */

  char **pzErrMsg           /* Write error messages here */

)

✒️参数说明:参考注释(摘自sqlite3源码)

     参数1 /* 执行SQL语句所在的数据库 */

     参数2 /* 执行的SQL语句 */

     参数3 /* 调用执行的回调函数程序 */

     参数4 /* 回调函数的第一个参数 */

     参数5 /* 记录错误信息 */

✒️返回值:同上 

4.(重要)回调函数callback 

 ✒️函数原型

static int callback(void *pArg,int nArg,char **azArg,char **azCol);

(上面是从sqlite3源码中截下来callback的函数原型,个人感觉参数名不大清晰)

static int callback(void *arg,int col_size,char **col_val,char **col_name);

✒️参数说明

        /*  参数1-void *pArg 由sqlite_exec函数传过来的参数(具体意义没有查到?)

            参数2-int nArg 回传过来的字段数(表的列数)

            参数3-char **azArg 存放表的数据的地址(字段的值)

            参数4-char **azCol 存放表的行(字段名)*/

✒️返回值

        /* 返回值为0时表中有几条数据就执行几次 */ 


五、C操作SQLite数据库

1.Demo1.c(执行select * from student.db

#include <stdio.h>
#include <sqlite3.h>

/* int callback(void *pArg, int nArg, char **azArg, char **azCol)*/
/* 回调函数,返回值为0时表中有几条数据就执行几次 */
/*  参数1-void *pArg 由sqlite_exec函数传过来的参数
    参数2-int nArg 回传过来的字段数(表的列数)
    参数3-char **azArg 存放表的数据(字段的值)
    参数4-char **azCol 存放表的行(字段名)
*/
int callback(void *pArg, int nArg, char **azArg, char **azCol){
    static int i = 0;
    if(!i){
        printf("%s\n",(char *)pArg);   //表的标题,由sqlite3_exec传过来的
        for(i=0;i<nArg;i++){
            printf("%s\t",azCol[i]);    //只打印输出一次表的字段名(表头)
        }
        printf("\n");
        printf("----------------------------------\n");
    }
    for(i=0;i<nArg;i++){
        printf("%s\t",azArg[i]);        //打印输出表的数据
    }
    printf("\n");
    return 0;
}

int main(int argc,char **argv){
    sqlite3 *pdb;
    char SQL_SELECT[] = "select * from stu_Info;";
    char *errorLog = NULL;
    void *p;
    if(argc < 2){
        printf("Usage:%s XXX.db\n",argv[0]);
        return -1;
    }else{
        if(sqlite3_open(argv[1],&pdb) == SQLITE_OK){        //打开数据库
            printf("open %s succeed!\n",argv[1]);
            if(sqlite3_exec(pdb,SQL_SELECT,callback,"student messege table",&errorLog)!=SQLITE_OK){ //执行SQL语句
                printf("SQL execute error %s\n",errorLog);    //执行失败打印错误信息
            }
        }else{
            printf("open error:%d\n",sqlite3_errcode(pdb)); //打开数据库失败输出错误码
        }
    }
    sqlite3_close(pdb);
    return 0;
}

2.Demo2.c(在demo1的基础上,将数据存在链表中)

(不会,mark以后再看看)

3.Demo3.c(创建表,并插入数据)

#include <stdio.h>
#include <sqlite3.h>

int callback(void *arg,int col_size,char **col_val,char **col_name){
    static int i = 0;
    if(!i){
        for(i=0;i<col_size;i++){
            printf("%s\t",col_name[i]);   //只打印输出一次表的字段名(表头)
        }
        printf("\n");
        printf("----------------------------------\n");
    }
    for(i=0;i<col_size;i++){
        printf("%s\t",col_val[i]);        //打印输出表的数据
    }
    printf("\n");
    return 0;
}

int main(int argc,char **argv){

    sqlite3 *pdb;
    int retn;
    char *errorLog;
    /* 创建成绩表,字段如下。为了美观代码分行,需加\连接*/
    char Create_Table[] = "create table scores( \
        ID    char primary key,\
        name  char not null,   \
        class int  not null,   \
        score int              \
    );";

    char Select_Table[] = "select * from scores;";
    char Insert_Table1[] = "insert into scores values('2022001','Socket',001,99);";
    char Insert_Table2[] = "insert into scores values('2022002','AF_INET',001,88);";
    char Insert_Table3[] = "insert into scores values('2022003','New',002,77);";
    if(argc < 2){
        printf("syntax error\nUages:%s xxx.db\n",argv[0]);
        return -1;
    }
    retn = sqlite3_open(argv[1],&pdb);
    if(retn != SQLITE_OK){
        printf("open %s error:%d\n",argv[1],sqlite3_errcode(pdb));
        return -1;
    }else{
        printf("open %s succeed\n",argv[1]);
    }

    retn = sqlite3_exec(pdb,Create_Table,NULL,NULL,&errorLog);
    if(retn != SQLITE_OK){
        printf("%s,error code:%d\n",errorLog,retn);
    }

    retn = sqlite3_exec(pdb,Insert_Table3,NULL,NULL,&errorLog);
    if(retn == SQLITE_OK){
        printf("Insert data succeed\n");
    }else{
        printf("%s,error code:%d\n",errorLog,retn);
    }

    sqlite3_exec(pdb,Select_Table,callback,NULL,&errorLog);
    sqlite3_close(pdb);
    return 0;
}
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。 SQLite功能   SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:   ATTACH DATABASE   BEGIN TRANSACTION   comment   COMMIT TRANSACTION   COPY   CREATE INDEX   CREATE TABLE   CREATE TRIGGER   CREATE VIEW   DELETE   DETACH DATABASE   DROP INDEX   DROP TABLE   DROP TRIGGER   DROP VIEW   END TRANSACTION   EXPLAIN   expression   INSERT   ON CONFLICT clause   PRAGMA   REPLACE   ROLLBACK TRANSACTION   SELECT   UPDATE   同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点象,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是 3.7.8 。它的官方网站是:http://www.sqlite. org或者http://www.sqlite .com .cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士 SQLite特性 下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.   1. ACID事务   2. 零配置 – 无需安装和管理配置   3. 储存在单一磁盘文件中的一个完整的数据库   4. 数据库文件可以在不同字节顺序的机器间自由的共享   5. 支持数据库大小至2TB   6. 足够小, 大致3万行C代码, 250K   7. 比一些流行的数据库在大部分普通数据库操作要快   8. 简单, 轻松的API   9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定   10. 良好注释的源代码, 并且有着90%以上的测试覆盖率   11. 独立: 没有额外依赖   12. Source完全的Open, 你可以用于任何用途, 包括出售它   13. 支持多种开发语言,C, PHP, Perl, Java, C#,Python SQLite类型 SQLite的数据类型   首先你会接触到一个让你惊讶的名词: Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释). 对于SQLite来说对字段不指定类型是完全有效的. 如:   Create Table ex1(a, b, c);   诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎. SQLite支持常见的数据类型, 如:   CREATE TABLE ex2(   a VARCHAR(10),   b NVARCHAR(15),   c TEXT,   d INTEGER,   e FLOAT,   f BOOLEAN,   g CLOB,   h BLOB,   i TIMESTAMP,   j NUMERIC(10,5)   k VARYING CHARACTER (24),   l NATIONAL VARYING CHARACTER(16)   );   前面提到在某种情况下, SQLite的字段并不是无类型的. 即在字段类型为”Integer Primary Key”时. 使用.NET操作SQLLITE   先下载ADO.NET2.0 Provider for SQLite。下载binaries zip版就可以了。下载完后解压缩,可以在bin目录下找到System.Data.SQLite.DLL。在vs2008中用Add Refrence功能把System.Data.SQLite.DLL加到工程里就可以了。运行下面代码试试:   string datasource = "e:/tmp/test.db";   System.Data.SQLite.SQLiteConnection.CreateFile(datasource);   //连接数据库   System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();   System.Data.SQLite.SQLiteConnectionStringBuilder connstr = new System.Data.SQLite.SQLiteConnectionStringBuilder();   connstr.DataSource = datasource;   connstr.Password = "admin";//设置密码,SQLite ADO.NET实现了数据库密码保护   conn.ConnectionString = connstr.ToString();   conn.Open();   //创建表   System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();   string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";   cmd.CommandText = sql;   cmd.Connection = conn;   cmd.ExecuteNonQuery();   //插入数据   sql = "INSERT INTO test VALUES('a','b')";   cmd.CommandText = sql;   cmd.ExecuteNonQuery();   //取出数据   sql = "SELECT * FROM test";   cmd.CommandText = sql;   System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();   StringBuilder sb = new StringBuilder();   while (reader.Read())   {   sb.Append("username:").Append(reader.GetString(0)).Append("\n")   .Append("password:").Append(reader.GetString(1));   }   MessageBox.Show(sb.ToString());

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值