SQLite资料
SQLite是一个开源的、内嵌式的关系型数据库。它最初由D. Richard Hipp 发布于2000年,它的应用可减少应用程序管理数据的开销,在便携性、易用性、紧凑性、有效性和可靠性方面有突出的表现[9]。
体系架构:SQLite拥有一个精致的、模块化的体系结构,并引进了一些独特的方法进行关系型数据库的管理。它由被组织在3个子系统中的8个独立的模块组成,如图3-1所示[9]。这个模型将查询过程划分为几个不连续的任务,就像在流水线上工作一样。在体系结构栈的顶部编译查询语句,在中部执行它,在底部处理操作系统的存储和接口。
图3-1 SQLite的体系架构
接口(Interface):由SQLite 的C 语言API函数组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的。一般来说,用户也是使用API函数来传递SQL语句的。
编译器(Compiler):编译过程从分词器(Tokenizer)和分析器(Parser)开始。它们协作处理文本形式的结构化查询(Structured Query Language, SQL)语句,分析其语法有效性,转化为底层能更方便处理的层次数据结构——语法树,然后把语法树传给代码生成器(code generator)进行处理。而代码生成器根据分析器生成一种SQLite专用的汇编代码,最后由虚拟机(Virtual Machine)执行。
虚拟机(Virtual Machine):架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual DataBase Engine,VDBE)。它和Java虚拟机相似,解释执行字节代码。VDBE的字节代码(称为虚拟机语言)由128个操作码(opcodes)构成,主要
是进行数据库操作。它的每一条指令或者用来完成特定的数据库操作(比如打开一个表的游标、开始一个事务等),或者为完成这些操作做准备。总之,所有的这些指令都是为了满足SQL命令的要求。VDBE的指令集能满足任何复杂SQL 命令的要求。所有的SQLite SQL语句——从选择和修改记录到创建表、视图和索引——都是首先编译成此种虚拟机语言,组成一个独立程序,定义如何完成给定的命令。
后端(Backend):后端由B-树(B-tree),页缓存(page cache,pager)和操作系统接口(即系统调用)构成。B-tree和page cache共同对数据进行管理。B-tree的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据。而pager的主要作用就是通过OS接口在B-tree和Disk之间传递页面。
总的来说,用户通过API接口函数传递SQL语言,编译器把SQL语言编译成虚拟机的指令,然后修改或者查找使用B-树和页缓存技术的后端来控制数据库。软件开发者的主要工作就在于使用API接口函数,后面的架构由数据库自己处理。
3.3.2接口中SQL语句的编译查询流程
由上节可知SQLite有完善的数据库体系架构,编译器、虚拟机和后端存储方法已经制定完善。用户只需要使用提供的接口传递SQL语句便可完成整个数据库操作。而接口主要是通过API函数来调用。由于SQLite源代码中已经写好丰富的API函数调用接口,程序开发者只需要用C或者C++语言来调用这些API 函数接口,便可以通过嵌入式操作系统控制DB数据库的效果,应用流程如下图3-2所示:
图3-2 API接口应用流程图
由应用流程图可以看出,SQLite数据库中的核心是API函数的调用。API 由两部分组成: 核心API(core API) 和扩展API(extension API)。核心API的函数实现基本的数据库操作:连接数据库,处理SQL,遍历结果集。它也包括一些实用函数,比如字符串转换,操作控制,调试和错误处理。扩展API通过创建你自定义的SQL函数去扩展SQLite。
SQLite 3.0一共有83个API函数,可以完成各种数据库操作。许多接口函数都是成对出现的,同时有UTF-8和UTF-16两个版本。并且提供了一组函数用来执行用户自定义的SQL函数和文本排序函数。常用的核心API函数有:int sqlite3_open(const char*, sqlite3**); //打开数据库函数
int sqlite3_open16(const void*, sqlite3**);
int sqlite3_close(sqlite3*); //关闭数据库函数
const char *sqlite3_errmsg(sqlite3*); //显示错误函数
const void *sqlite3_errmsg16(sqlite3*);
int sqlite3_errcode(sqlite3*); //显示错误代码函数
typedef int (*sqlite_callback)(void*,int,char**, char**);//回调函数定义
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**); //执行函数typedef struct sqlite3_stmt sqlite3_stmt; //字节码定义int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);//准备函数
int sqlite3_finalize(sqlite3_stmt*); //定案函数
int sqlite3_reset(sqlite3_stmt*); //重置函数
以上核心API函数主要与执行SQL命令有关。有两种方法执行SQL语句:预编译查询和封装查询[10]。
最简单的数据库控制,即封装查询只需要使用三个API函数就可以完成: sqlite3_open(), sqlite3_exec(), 和sqlite3_close(),其中sqlite3_exec()是封装好的SQL语句执行模式。
想更好的控制数据库引擎的执行,则需要使用预编译的SQL语句查询模式。使用提供的sqlite3_prepare()函数把SQL语句编译成字节码,然后在使用sqlite3_step()函数来执行编译后的字节码。其实封装查询只是对预编译查询的三个过程进行了包装而已,最终也会转化为预编译查询来执行。预编译查询流程图如图3-3所示:
图3-3 预编译查询流程图
由流程图中可以看到预编译查询由三个阶段构成:准备(preparation)、执行(execution)和定案(finalization)。
1、准备指令函数:
使用分词器(tokenizer) 、分析器(parser)和代码生成器(code generator)把SQL
语句编译成VDBE字节码,编译器会创建一个语句句柄(sqlite3_stmt),它包括字节码以及其它执行命令和遍历结果集所需的全部资源。相应的API函数为sqlite3_prepare(),位于prepare.c文件中。结构体原型如下:
int sqlite3_prepare(
sqlite3 *db,
const char *zSql,
int nBytes,
sqlite3_stmt **ppStmt,
const char **pzTail
){
int rc;
rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,ppStmt,pzTail);
assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 );
return rc;
}
其中,db是数据库名,zSql是指向SQL语句的指针,在调用prepare函数之前要先定义好SQL语句的字符串,SQL语句应该是UTF-8编码的。ppStmt 则用来指向输入参数中下一个需要编译的SQL语句存放的SQLite statement对象的指针。
2、执行函数:
使用虚拟机执行字节码,执行过程是一个步进(stepwise)的过程,每一步(step)由sqlite3_step()启动,并由VDBE执行一段字节码。当第一次调用sqlite3_step()时,一般会获得一种锁,锁的种类由命令要做什么(读或写)决定。对于SELECT 语句,每次调用sqlite3_step()使用语句句柄的游标移到结果集的下一行。对于结果集中的每一行,它返回SQLITE_ROW,当到达结果末尾时,返回SQLITE_DONE。对于其它SQL语句(INSERT、UPDATE、DELETE等),第一次调用sqlite3_step()就导致VDBE执行整个命令。
3、定案结束函数:
VDBE关闭语句,释放资源。相应的API函数为sqlite3_finalize(),它导致
VDBE结束程序运行并关闭语句句柄。当sqlite3_finalize()执行成功,所有与语句对象关联的资源都将被释放。在自动提交模式下,还会释放关联的数据库锁。
总而言之,在使用接口函数时,软件开发者主要在于调用SQL语句,使用预编译方式可以更有效准确地编译SQL语句,使用封装方式可以更加快速方便地使用SQL语句。两种方式都是把SQL语句编译成字节码,由虚拟机去执行。由于博物馆使用的数据库不复杂,所用的SQL语句也是比较常见的,故使用的是封装的查询方式。
3.3.3 最新版本的改进和优势
在很多方面,SQLite 3是一个与SQLite 2完全不同的数据库,并且提供了很多在适应性、特色和性能方面的改进。
1、首先,SQLite3的API被彻底重新设计了,并具有了许多新特性。由第二版的15个函数增加到88个函数。这些函数包括支持UTF-8和UTF-16编码的功能函数,在最新的3.6版本中,SQL语句也可以直接使用中文了。
2、SQLite 3包含一个改进了的B-tree模型。现在对库表使用B+tree,在B+树中,所有的数据都被存储在(数据结构中)树结构端结点,而不是既在(数据结构中)树结构端结点又在树的分支节点。B+树型数据表格具有很好的测量性,并且可以存储比较大的数据组。大大提高查询效率,存储大数据字段更有效,并可以从磁盘上删除不用了的字段。其结果是数据库文件的体积减小了25–35%并改善了全面性能[11]。
3、SQLite 3最重要的改变是它的存储模型。由第二版只支持文本模型,扩展到支持5种本地数据类型。每种类型都被优化,以得到更高的查询性能并战用更少的存储空间。例如,整数和浮点数以二进制的形式存储,而不再是以ASCII 形式存储,减少了数据库的占用空间和方便了查询过程。
再加上SQLite自身对比其他数据库具有的优势:
1、小型:QLite的设计可以说是功能齐全但体积很小:2个头文件,1个源文件,1个库,不需要扩展的数据库服务。所有的东西,包括客户端、服务器和虚拟机等,都被打包在1兆大小左右。也可以在编译时去掉不需要的特性,进一步的缩小体积。相比其他数据库来说,体积非常小。
2、开源性:SQLite的全部代码都在公共域中,不需要授权。SQLite的任何一部分都没有附加版权要求。所有曾经为SQLite项目贡献过代码的人都签署过一个宣誓书将他们的贡献发布到公共域。也就是说,无论你如何使用SQLite的代码都不会有法律方面的限制。你可以修改、合并、发布、出售或将这些代码用于任何目的,商业和中非商业的,不需要支付任何费用,不会受到任何限制。这对于开发产品,可以大大地降低成本。
3、简洁易读性:SQLite的源代码不但免费,还编写得很好。作为程序库,SQLite的API可以算是最简单最易用的了。SQLite既有很好的文档又很容易望文知意。SQLite源代码包含大约30000行标准C代码,它是干净的、模块化的和完好注释的。SQLite源代码易理解、易定制[12]。
以上特点和优势非常符合本导游器查询速度要快、数据库和开发平台尽量小型化、免费使用、可以个性化代码修改等的设计要求。所以本设计中,导游器自然选用这最新版本的SQLite3作为移动嵌入式数据库。
sqlite3常用命令及语法
https://www.doczj.com/doc/7715332000.html,/linchunhua/article/details/7184439 sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite 大量的被用于手机,PDA,MP3播放器以及机顶盒设备。 Mozilla Firefox使用SQLite作为数据库。 Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。 PHP将SQLite作为内置的数据库。 Skype客户端软件在内部使用SQLite。 SymbianOS(智能手机操作平台的领航)内置SQLite。 AOL邮件客户端绑定了SQLite。 Solaris 10在启动过程中需要使用SQLite。 McAfee杀毒软件使用SQLite。 iPhones使用SQLite。 Symbian和Apple以外的很多手机生产厂商使用SQLite。 下面就sqlite中的常用命令和语法介绍 https://www.doczj.com/doc/7715332000.html,/download.html可下载不同操作系统的相关版本sqlite gedit 也可以使用火狐中的插件sqlite manager 新建数据库 sqlite3 databasefilename 检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建)如果已经存在直接进入数据库对数据库进行操作 sqlite中命令: 以.开头,大小写敏感(数据库对象名称是大小写不敏感的) .exit .help 查看帮助针对命令 .database 显示数据库信息;包含当前数据库的位置 .tables 或者.table 显示表名称没有表则不显示 .schema 命令可以查看创建数据对象时的SQL命令; .schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示 .read FILENAME 执行指定文件中的SQL语句 .headers on/off 显示表头默认off .mode list|column|insert|line|tabs|tcl|csv 改变输出格式,具体如下 sqlite> .mode list sqlite> select * from emp; 7369|SMITH|CLERK|7902|17-12-1980|800||20 7499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30 如果字段值为NULL 默认不显示也就是显示空字符串
sqlite3使用教程
Sqlite3教程 一、基本命令 1、进入命令行环境: 显示版本号,并告诉每一条SQL语句必须用分号;结尾2、命令行帮助:
3、退出命令行环境 或者 二、数据库相关命令 1、创建(或打开)一个新的数据库:文件名 若文件存在,刚打开该文件;若文件不存在,则创建一个*.db数据库文件。 导入SQL语句文件。
、列出所有数据表: 4、显示数据库结构: 用一些SQL语句描述数据库的结构。 5、显示表的结构:表名 6、导入数据:文件名表名 若导入csv文件,设置分隔符为逗号。 、导出数据:文件名 查询结果默认在终端显示,查询表格结构,语句查询表格数据。设置查询目标后,查询结果显示在设置的文件中 文件名 然后输入sql查询语句,查询的结果显示在设置的文件中,不在终端显示 运行恢复导出到终端(标准输出)。 导出数据到excle表格中 设置分隔符为逗号: 设置导出文件名,后缀为csv: 查询语句:表名
三、数据显示命令 运行表名,显示全表的内容 1.设置分隔符:分隔符 默认分隔符是“|”。 2.设置显示模式:模式
默认的是list显示模式,一般使用column模式。 3.显示标题栏: 4.设置每一列的显示宽度: 5.列出当前显示格式设置情况: 四、数据库基本操作 1.数据库定义语言DDL 在关系型数据库中,数据库中的表table、视图、索引、关系和触发器等等,构成了数据库的架构。在SQL语句中,专门有一些语句用来定义数据库架构,这些语句被称为“数据库定义语言”,即DDL。 SQLite数据库引擎支持下列三种DDL语句: ●CREATE:创建 ●ALTER TABLE:改变表的结构 ●DROP:删除
SQLITE3的操作方法及应用
数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件。 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。 1.打开数据库,创建表 1.1sqlite*db;定义一个sqlite*的变量 sqlite3_open(“./link.db”,&db); 在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db 的数据库。 1.2sql="create table weblink(id integer primary key,domain text,page text,fromdomain text,status integer);" 在已打开的数据库中创建一个名weblink的表。表的属性如下: id integer primary key:ID号(表中黙认包含的) domain text:域名 page text:子网页 fromdomain text:源域名 status integer:状态标志 1.3sqlite3_exec(db,sql,NULL,NULL,NULL); 执行一条sql语句的函数。 函数原型:int sqlite3_exec(sqlite3*,const char*sql,sqlite3_callback,void*,char**errmsg) 第1个参数是前面open函数得到的指针。说了是关键数据结构。 第2个参数const char*sql是一条sql语句,以\0结尾。 第3个参数sqlite3_callback是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习) 第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char**errmsg是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf(“%s\n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。 说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表
sqlite 基本操作 全
sqlite3本地数据库学习 sqlite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比mysql还快,专门用于移动设备上进行适量的数据存取,它只是个文件,不需要服务器进程。 常用术语:表(table)、字段(colum,列,属性)、记录(row,record) 关键字:select、insert、updete、delete、from、creat、where、desc、order、by、group、table、alter、view、index等。 1、安装sqlite3 sudo()apt-get()install()sqlite3 2、存储类型 integer 整型:int,shoert,long text 文本字符串:string real 浮点型:float,double blob 二进制 3、字段结束 not null:字段的值不能为空 unique:字段的值必须是唯一的 default:指定字段的默认值 primarykey:主键,用来唯一的标识某条记录,相当于记录的身份证。主键可以是一个或多个字段,应由计算机自动生成和管理。主键字段默认包含了not null和unique两个约束。 autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。 外键:利用外键可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键。 4、创建数据库usr.db在当前目录下 sqlite3()usr.db 5、创建表格,表格内容以树状存储 create()table()表名(字段名1()字段类型1,字段名2()字段类型2...) 6、数据库中不能使用关键字命名表和字段,不区分大小写,每条语句后加";"结尾 7、删除表格 drop()table()表名 8、向表格里添加数据 insert()into()表名(字段1,字段2...)values(字段1的值,字段2的值...) 8、修改表中的数据 updata()表名()set()字段1=字段1的值,字段2=字段2的值... //将字段为name全部修改成'Tom' updata()stu()set()name='Tom'; //将字段为id=1001的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001; //将字段为id=1001同时字段name='lisi'的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001()and()name='lisi'; 9、删除表中的数据
QSQLite 数据库
这里我们只是演示了一下使用这个框架完成最简单的程序的过程,只起到抛砖引玉的作用。这个框架很复杂,但是功能也很强大,Qt Creator中自带了几个相关的例子(在帮助中查找Graphics View Examples即可),你可以参考一下。因为篇幅问题,我们就只讲这么多,如果以后有机会,我会推出一个相关的专题来讲述这个框架。 分类:Qt系列教程作者: yafeilinux 日期:四月 30th, 2010. 3,006 views Tags: 2D绘图, creator, qt, yafeilinux, 教程
二十一、Qt数据库(一)简介 本文章原创于https://www.doczj.com/doc/7715332000.html,转载请注明出处。 从今天开始我们学习Qt数据库编程的内容。 先说明:我们以后使用现在最新的基于Qt 4.6.2的Qt Creator 1.3.1 Windows版本,该版本是2010年2月17日发布的。 数据库几乎是每个较大的软件所必须应用的,而在Qt中也使用QtSql模块实现了对数据库的完美支持。我们在Qt Creator的帮助中查找QtSql Module,其内容如下图: 可以看到这个模块是一组类的集合,使用这个模块我们需要加入头文件#include ,而在工程文件中需要加入一行代码:QT += sql 这里每个类的作用在后面都有简单的介绍,你也可以进入其中查看其详细内容。下面我们先简单的说一下QSqlDatabase类和QSqlQuery类。 QSqlDatabase类实现了数据库连接的操作,现在Qt支持的数据库类型有如下几种: 而现在我们使用的免费的Qt只提供了SQLite和ODBC数据库的驱动(我们可以在Qt Creator 安装目录下的qt\plugins\sqldrivers文件夹下查看),而其他数据库的驱动需要我们自己添加。SQLite是一个小巧的嵌入式数据库,关于它的介绍你可以自己在网上查找。 QSqlQuery类用来执行SQL语句。(关于SQL语句:在我的教程中只会出现很简单的SQL语句,你没有相关知识也可以看懂,但是如果想进行深入学习,就需要自己学习相关知识了。)
SQLITE最基本操作
SQLite数据库的基本操作 main.xml(主布局) android:orientation="vertical">