目录
SQLite简介
轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库,传统服务器型数据库用于管理多端设备,更加复杂。
SQLite是一个无服务器的数据库,是自包含的。这也成为嵌入式数据库,这意味着数据库引擎作为应用程序的的一部分运行。
MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。
SQLite的优点 | SQLite的缺点 | MySQL的优点 | MySQL的缺点 |
基于文件,易于设置和使用 适合基础开发和测试 轻松携带 使用标准SQL语法进行微小更改 使用方便 | 缺乏用户管理和安全功能 不容易扩展 不适合大数据库 无法定制 | 使用方便 提供了许多与数据库相关的功能 良好的安全功能 提供良好的速度和性能 提供良好的用户管理和多种访问机制 | 需要一些技术专业知识来设置 与传统SQL相比,语法略有不同 |
基于嵌入式的数据库主要有:SQLite、 Firebird、Berkeley DB、eXtremeDB
Firebird是关系型的数据库,功能强大,支持存储过程,SQL兼容等
SQLite关系型数据库,体积小,支持ACID事务
Berkeley DB并没有数据库服务器概念,他的程序直接连接到应用层中
eXtremeDB是内存数据库,运行效率高
SQLite数据库安装
下载地址:
安装方式1:
sudo apt-get install sqlite
安装方式2:
- 把下载的sqlite-sutoconf-34000000.tar.gz上传到开发板
- tar xvf sqlite-sutoconf-34000000.tar.gz 解压
- cd sqlite-sutoconf-34000000.tar.gz进入文件夹
- ./configure --prefix=/usr/local 配置安装在/usr/local
- make 编译 //比较久(10分钟)
- sudo make install 安装
如上图,安装成功后,运行sqlite3进去SQL命令操作流程。
SQLite的命令用法
-
创建一个数据库
方式一:
- sqlite3 进入数据库
- .open test.db
- .quit
数据库退出后在命令当前路径创建数据库test.db
方式二:
sqlite3 test.db //在命令运行当前窗口创建数据库test.db
在数据库命令下
.database 列出当前打开的数据库
.quit 退出
-
创建一张表格
create table stu(id Integer,name char,score Integer);
-
插入一条记录
insert into stu values(001,'zhangsan',100); insert into stu values(002,"lisi",99); //''和""都行 insert into stu (name,score) values("wangwu",98); //插入部分字段内容
-
查看数据库的记录
select * from stu; //查询所有字段的结果 select name,sore from stu; //查询数据库中部分字段的内容
-
删除一条记录
delete from stu where id = 001;
-
更改一条记录
update stu set name = 'mazi' where id = 002;
-
删除一张表
drop table stu;
更全面的SQLite命令介绍:SQLite 简介 | 菜鸟教程 (runoob.com)
SQLite的编程操作
打开/创建数据库的C接口
下面的代码显示了如何连接到一个现有的数据库,如果数据库不在,那么它就会被创建,最后一个将返回已一个数据库对象。
#include <sqlite3.h>
sqlite3_open(const char *filename,sqlite3 **ppDb);
该例程打开一个只想SQLite 数据库文件的链接,返回一个用于其他SQLite 程序的数据库连接对象
sqlite3(sqlite3*);
该例程关闭之前调用 sqlite3_open() 打开的数据库连接,所有与连接相关的语句都应在连接关闭之前完成
如果还有查询没完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误信息
const char *sqlite3.errmsg(sqlite3*);
sqlite3_errcode()通常来获取最近调用的API接口返回的错误代码。
错误码(Result Codes)
#define SQLITE_OK 0 /* 成功 | Successful result */
/* 错误码开始 */
#define SQLITE_ERROR 1 /* SQL错误 或 丢失数据库 | SQL error or missing database */
#define SQLITE_INTERNAL 2 /* SQLite 内部逻辑错误 | Internal logic error in SQLite */
#define SQLITE_PERM 3 /* 拒绝访问 | Access permission denied */
#define SQLITE_ABORT 4 /* 回调函数请求取消操作 | Callback routine requested an abort */
#define SQLITE_BUSY 5 /* 数据库文件被锁定 | The database file is locked */
#define SQLITE_LOCKED 6 /* 数据库中的一个表被锁定 | A table in the database is locked */
#define SQLITE_NOMEM 7 /* 某次 malloc() 函数调用失败 | A malloc() failed */
#define SQLITE_READONLY 8 /* 尝试写入一个只读数据库 | Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* 操作被 sqlite3_interupt() 函数中断 | Operation terminated by sqlite3_interrupt() */
#define SQLITE_IOERR 10 /* 发生某些磁盘 I/O 错误 | Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* 数据库磁盘映像不正确 | The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* sqlite3_file_control() 中出现未知操作数 | Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* 因为数据库满导致插入失败 | Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* 无法打开数据库文件 | Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* 数据库锁定协议错误 | Database lock protocol error */
#define SQLITE_EMPTY 16 /* 数据库为空 | Database is empty */
#define SQLITE_SCHEMA 17 /* 数据结构发生改变 | The database schema changed */
#define SQLITE_TOOBIG 18 /* 字符串或二进制数据超过大小限制 | String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* 由于约束违例而取消 | Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* 数据类型不匹配 | Data type mismatch */
#define SQLITE_MISUSE 21 /* 不正确的库使用 | Library used incorrectly */
#define SQLITE_NOLFS 22 /* 使用了操作系统不支持的功能 | Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* 授权失败 | Authorization denied */
#define SQLITE_FORMAT 24 /* 附加数据库格式错误 | Auxiliary database format error */
#define SQLITE_RANGE 25 /* 传递给sqlite3_bind()的第二个参数超出范围 | 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* 被打开的文件不是一个数据库文件 | File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() 已经产生一个行结果 | sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() 完成执行操作 | sqlite3_step() has finished executing */
/* 错误码结束 */
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
sqlite3 *db;
int ret;
if(argc < 2)
{
printf("Usage: %s xxx.db\n",argv[0]);
exit(-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));
}
sqlite3_close(db);
printf("done\n");
return 0;
}
创建表的C接口
下面的C代码将用于在先前创建的数据库中创建一个表:
sqlite3_exec(sqlite3* , const char *sql, sqlite_callback , void *data,char **errmsg);
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以有多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开数据库的对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。
sqlite_exec() 程序解析并执行由 sql 参数所给的每个命令,知道字符串结束或者遇到错误位置。
callback 函数:
int callback(void *arg,int column_size,char *column_value[ ],char *column_name[ ]);
参数分析:
void *arg :是sqlite_exec函数的第四个参数
column_size :数据库的字段数
column_value[ ] :列的值
column_name[ ] :字段名字
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int callback(void *arg,int column_size,char *column_value[ ],char *column_name[ ])
{
int i;
printf("%s\n",(char *)arg);
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;
char *errmsg;
int ret;
if(argc < 2)
{
printf("Usage: %s xxx.db\n",argv[0]);
exit(-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));
}
//创建一个新表
//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,"content of sql:",&errmsg);
//errmsg 野指针并不发生段错误,该函数内部会对野指针进行一些操作
if(ret != SQLITE_OK)
{
printf("create: ret = %d,error:%s\n",ret,errmsg);
}
//往表里面插入信息
ret = sqlite3_exec(db,"insert into Class01 values(001,'zhangsan',100);",callback,"content of sql:",&errmsg);
if(ret != SQLITE_OK)
{
printf("insert: ret = %d,error:%s\n",ret,errmsg);
}
//查看表里面的内容
ret = sqlite3_exec(db,"select * from Class01;",callback,"content of sql:",&errmsg);
if(ret != SQLITE_OK)
{
printf("select: ret = %d,error:%s\n",ret,errmsg);
}
sqlite3_close(db);
printf("done\n");
return 0;
}