目录
提示:如果读者对于Oracle数据库了解的话,那么对于SQLite数据库的相关操作也类似。
嵌入式数据库将数据库系统与操作系统和具体应用集成在一起,运行在各种智能嵌入式设备上。与传统的数据库系统相比,它一般体积较小,有较强的便携性和易用性,以及较为完备的功能来实现用户对数据库的管理操作。
嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进行运行时,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在速度更快,需要较少的内存。
- 嵌入式数据库不仅可以嵌入式到其他的软件当中,也可以嵌入到硬件设备当中。
- 嵌入式系统能够在没有人工干预的情况下长时间不间断的运行。
- 实时性。
- 嵌入式数据库具有一定较好的移动性。
- 软件嵌入式数据库
- 面向软件的嵌入式数据库,将数据库作为组件嵌入到其他的软件系统中,一般对于数据库的安全性,稳定性和速度要求比较高。
- 设备嵌入式数据库
- 将关系型数据库嵌入到设备当中去,作为设备资源数据处理的核心组件,要求具有很高的实时性和稳定性。
- 内存数据库
- 数据库直接在内存中运行,数据处理更加高速,但是安全性方面需要额外的手段来保障。
- 医疗领域
- 军事设备和系统
- 地理信息系统
- 工业控制
- 网络通信
- 空间搜索
- 消费类电子
开始安装软件的时候可能需要换源:Ubuntu换源教程
SQLite对SQL92标准的支持包括索引,限制,触发和查看。SQLite不支持外键限制,但支持原子的,一致的,独立的和持久的事务。
- 原子的:它们要么完全执行,要么根本不执行;
- 一致的:在不一致的状态中,数据库从未被保留;
- 独立的:在同一时间同一数据库上有两个执行操作的事务,那么这两个事务互不干扰;
- 持久的:数据库能够在崩溃和断点的情况下不丢失数据或损坏。
SQLite数据库包含的组件:SQL编译器,内核,后端以及附件。
SQLite支持高达2TB的数据库,每个数据库完全存储在单个磁盘文件中,这些磁盘文件在不同字节顺序的计算机之间移动。
下载:sudo apt-get install sqlite
打开:sqlite3 mydb.db
提示:读者也可以到官网下载源码编译安装:SQLite数据库官网源码下载
下载:sudo apt-get install sqlitebrowser
打开:sqlitebrower
命令 | 说明 |
.database | 列出附加数据库的名称和文件 |
.open [数据库名称] | 打开数据库 |
.chanages on |off | 显示SQL更改的行数 |
.table | 查看当前数据库下的表 |
.schema | 查看数据库的表结构 |
.quit | 退出数据库 |
.exit | 退出数据库 |
.output | 查询的结果输出到文件,如:.output demo.txt |
.dump | 输出表结构,同时输出操作记录,可以创建一个包含必要命令和数据的文件。 |
类型 | 说明 |
integer | 无符号整形 |
varchar(20) | 可变长的字符数据 |
text | 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE |
real | 浮点型 |
blob | 存储Blob数据,该类型数据和输入数据完全相同。 |
create table [创建表名](属性1,属性2,属性3……)
如:create table demo(id integer,name varchar(20))
insert into table_name values(data1,data2,……)
如:insert into demo values(1,'tom');
select column from table_name where expression;
如:查询表中id=1的信息
select *
from demo
where id=1;
update table_name set data1=[修改的值] where expression;
如:修改id=1的信息
update demo
set name='gupdf'
where id=1;
create index index_name on table_name (field_to_be_indexed);
如:对表demo的id建立一个索引sea
create index
sea on demo(id);
删除数据:delete from table_name where expression;
如:delete from demo where id=1;
删除表:drop table table_name;
drop table demo;
在使用SQLite数据库的API之前,首先了解一些知识点:
我们在使用SQLite3之前都是需要导入头文件了
但是这个头文件在下载的sqlite3中是不包含的,看下:
可以下载sqlite3文件查看里面并不包含include文件:sudo apt-get download sqlite3
下载sqlite3头文件:
知识点来源:知识点来源
int sqlite3_open(
const char*filename,//数据库名称
sqlite3**ppDb//输出参数,SQLite数据库句柄
);
提示:该函数用来打开或者创建一个SQLite数据库。
- 如果在包含该函数的文件所在的路径下有同名的数据库(*.db),则打开数据库;
- 如果不存在数据库,则在该路径下创建一个同名的数据库。
- 如果打开或者创建数据库成功,则该函数返回0,输出参数为SQLite3类型的变量,后序对该数据库的操作,通过参数进行传递。
格式:int sqlite3_close(sqlite3*db);
提示:结束对数据库的操作之后需要调用该函数关闭数据库,该函数的参数为成功打开数据库时输出参数——SQLite3类型变量(句柄)
格式:
int sqlite3_exec(
sqlite3*,//打开数据库的名称
const char*sql,//要执行的SQL语句
sqlite_callback,//回调函数
void*,//回调函数的参数
char **errmsg//错误信息
)
提示:如果要对数据库进行操作,即可使用该函数来完成。如果出现错误信息的话,可以相应的错误信息保存到errmsg中。
格式:void sqlite3_free(char*z)
提示:在对数据库操作时,如果需要释放在中间过程中保存在内存中的数据,则可以通过此函数来清除内存空间。
格式:const char *sqlite3_errmsg(sqlite3*)
提示:将在对数据库的操作过程出现的错误信息通过此函数输出。
格式:int sqlite3 _get_table(
sqlite3*,//打开数据库名称
const char*sql,//执行的SQL语句
char***resultp,//输出的结果
int *nrow,//输出结果的行数
int *ncolumn,//输出结果的列数
char**errmsg//错误信息
)
提示:对数据库进行操作时,通过此函数来获取结果。
函数的入口参数为查询的SQL语句,出口参数为二维指针,指示查询结果的内容,还有结果的行数和列数,行数为纯记录条数,但是resultp数组里面包含了一行字段名的值。
resultp输出的结果应该是下面的样子(了解输出的结果才能很好的对结果进行处理):
格式:int sqlite3_free_table(char**result)
提示:释放sqlite3 _get_table函数所分配的内存。
格式:int sqlite3_prepare(
sqlite3*,
const char*,
int sqlite3_stmt**,
const char**
)
提示:将一条SQL语句编译成字节码留给后面的执行函数,使用该接口访问数据库当前比较的一种方式。
格式:int sqlite3_finalize(sqlite3_stmt*)
提示:销毁将一个准备好的SQL声明,在数据库关闭之前,所有准备好的声明都将被释放销毁。
格式:int sqlite3_reset(sqlite3_stmt*)
提示:重置一个SQL声明的状态,使得它可以被再次执行。
例子1描述:使用SQLite的API函数实现新建一个数据库student.db,并且在数据库中创建表demo,想表中插入数据,查询插入的数据,最后关闭数据库。
第一步:创建一个.c文件sudo touch sqlite_Demo01.c
打开.c文件编写代码:sudo gedit sqlite_Demo01.c
第一步:打开数据库
- //open the database
- sqlite3 *ppdb;
- int ret=sqlite3_open("student.db",&ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite3_open: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
第二步:创建表
- //create table
- char sql[maxn]={0};
- sprintf(sql,"create table if not exists demo(id integer primary key,name varchar(20));");
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_create_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
-
第三步:插入数据
- //insert the data
- int id;
- int i;
- char name[32]={0};
- int n;
- printf("please entry the insert number: ");
- scanf("%d",&n);
-
- for(i=0;i<n;i++){
- printf("please entry the id and name\n");
- scanf("%d %s",&id,name);
- //clean the sql
- memset(sql,0,sizeof(sql));
- sprintf(sql,"insert into demo values(%d,'%s');",id,name);
- //exert the sqlite3_exec
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_insert_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- }
第四步:查询数据
- //select the table
- memset(sql,0,sizeof(sql));
- sprintf(sql,"select * from demo;");
- ret=sqlite3_exec(ppdb,sql,print,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_select_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
打印输出的回调函数print如下:
- //print function
- //the name dedicate id and name
- //the value dedicate id=1 and name='tom'......
- int print(void*arg,int column,char**value,char**name){
- int i;
- for(i=0;i<column;i++){
- printf("%s = %s ",name[i],value[i]);
- }
- printf("\n");
- //return 0 represent select successfully
- return 0;
- }
这里的column表示字段数
value表示每一个字段对应的值;
name对应每一个字段名;
查询方式二:
- //the second select method
- char **result;
- int row,column;
- ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_select_2_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
-
- int j;
- int index=column;
- for(i=0;i<row;i++){
- for(j=0;j<column;j++){
- printf("%s = %s ",result[j],result[index]);
- index++;
- }
- printf("\n");
- }
这里的column指的是字段数;
这里的row表示行数;
数据结果集中排列方式如下:
最后一步:关闭数据库
- //关闭数据库
- ret=sqlite3_close(ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_close_database: %s\n",sqlite3_errmsg(ppdb));
- }
完整代码
- #include<stdio.h>
- #include<stdlib.h>
- #include<sqlite3.h>
- #include<string.h>
-
- #define maxn 100
-
- //print function
- //the name dedicate id and name
- //the value dedicate id=1 and name='tom'......
- int print(void*arg,int column,char**value,char**name){
- int i;
- for(i=0;i<column;i++){
- printf("%s = %s",name[i],value[i]);
- }
- printf("\n");
- //return 0 represent select successfully
- return 0;
- }
-
- int main(){
- //open the database
- sqlite3 *ppdb;
- int ret=sqlite3_open("student.db",&ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite3_open: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- //create table
- char sql[maxn]={0};
- sprintf(sql,"create table if not exists demo(id integer primary key,name varchar(20));");
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_create_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
-
- //insert the data
- int id;
- int i;
- char name[32]={0};
- int n;
- printf("please entry the insert number: ");
- scanf("%d",&n);
-
- for(i=0;i<n;i++){
- printf("please entry the id and name\n");
- scanf("%d %s",&id,name);
- //clean the sql
- memset(sql,0,sizeof(sql));
- sprintf(sql,"insert into demo values(%d,'%s');",id,name);
- //exert the sqlite3_exec
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_insert_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- }
-
- //select the table
- memset(sql,0,sizeof(sql));
- sprintf(sql,"select * from demo;");
- ret=sqlite3_exec(ppdb,sql,print,NULL,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_select_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- //the second select method
- char **result;
- int row,column;
- ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,NULL);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_select_2_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
-
- int j;
- int index=column;
- for(i=0;i<row;i++){
- for(j=0;j<column;j++){
- printf("%s = %s ",result[j],result[index]);
- index++;
- }
- printf("\n");
- }
- //关闭数据库
- ret=sqlite3_close(ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite3_exec_close_database: %s\n",sqlite3_errmsg(ppdb));
- }
- return 0;
- }
运行:sudo gcc [源文件.c] -o [可执行文件.o] -lsqlite3
例子2:创建一个数据库SQLdatabase数据库,并且创建一个demo表,向表中插入数据并且对插入的数据进行查询,更改和删除,最后关闭数据库。
- #include<stdio.h>
- #include<stdlib.h>
- #include<sqlite3.h>
- #include<string.h>
-
-
- #define maxn 100
-
- int print(void*arg,int column,char**value,char **name){
- int i;
- for(int i=0;i<column;i++){
- printf("%s = %s \n",name[i],value[i]);
- }
- printf("\n");
- return 0;
- }
-
-
- int main(){
- //open the database
- int i;
- sqlite3*ppdb;
- int ret = sqlite3_open("SQLdatabase.db",&ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_open: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- //create the table
- char*Errormsg;
- char sql[maxn]={0};
- sprintf(sql,"create table if not exists demo(id integer,name varchar(20),sex integer);");
- ret = sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_exec_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- //insert data into table
- int id,sex;
- char name[30]={0};
- int n;
- printf("please entry the n number: \n");
- scanf("%d",&n);
-
- for(i=0;i<n;i++){
- printf("please entry the id ,name and sex\n");
- scanf("%d %s %d",&id,name,&sex);
- memset(sql,0,sizeof(sql));
- sprintf(sql,"insert into demo values(%d,'%s',%d);",id,name,sex);
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_insert_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- }
-
- //select the data
- //the first method
- memset(sql,0,sizeof(sql));
- sprintf(sql,"select * from demo;");
- ret=sqlite3_exec(ppdb,sql,print,NULL,&Errormsg);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_select_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
-
- //the second method
- int row;
- int column;
- char**result;
- ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,&Errormsg);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_get_table: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- int j;
- int index=column;
- for(i=0;i<row;i++){
- for(j=0;j<column;j++){
- printf("%s = %s ",result[i],result[index]);
- index++;
- }
- printf("\n");
- }
-
- //delete the data
- memset(sql,0,sizeof(sql));
- printf("please entry the delete id: ");
- scanf("%d",&id);
- sprintf(sql,"delete from demo where id=%d;",id);
- ret=sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_delete_data: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- //close the database
- ret=sqlite3_close(ppdb);
- if(ret!=SQLITE_OK){
- printf("sqlite_error_close_database: %s\n",sqlite3_errmsg(ppdb));
- exit(1);
- }
- return 0;
- }
-
-
-
-
-
- 目前没有可用于SQLite的网络服务器。
- SQLite只提供数据库级IDE锁定;
- SQLite没有用户账户概念;
- SQLite支持多数的SQL92标准,不受支持的一些功能包括完全触发器支持和写视图。