浅谈SQLite
sqlite 事务的实现原理
![sqlite 事务的实现原理](https://img.taocdn.com/s3/m/7f1637005627a5e9856a561252d380eb629423c8.png)
sqlite 事务的实现原理SQLite是一种轻量级的数据库管理系统,支持事务的原子性、一致性、隔离性和持久性(ACID)特性。
事务是数据库管理系统中用于实现一组相关操作的机制,它可以确保一组操作要么全部成功执行,要么全部回滚到原始状态,从而保持数据的完整性和一致性。
本文将介绍SQLite事务的实现原理。
在SQLite中,事务以SQL语句的方式进行操作。
事务可以包含多个SQL语句,这些语句可以是插入、更新或删除数据的操作。
当执行一个事务时,SQLite会将所有的操作当作一个原子操作来处理,即要么全部成功执行,要么全部回滚到事务开始前的状态。
这种原子性是通过日志和回滚日志的方式实现的。
SQLite使用了一种称为“写日志”的技术来保证事务的原子性。
在执行一个事务之前,SQLite会将所有的修改操作记录在一个日志文件中,这个文件称为“写日志”。
当事务成功执行时,SQLite会将这个日志文件写到数据库文件中,从而保证了事务的原子性。
如果事务执行过程中发生了错误或回滚操作,则可以根据日志文件将数据库回滚到原始状态。
除了写日志,SQLite还使用了“回滚日志”的技术来实现事务的回滚操作。
在执行一个事务之前,SQLite会将当前的数据库状态记录在一个回滚日志文件中。
如果事务执行过程中发生了错误或回滚操作,则可以根据回滚日志文件将数据库回滚到事务开始前的状态。
在SQLite中,事务的隔离性是通过锁机制来实现的。
当一个事务对数据库进行修改时,它会获取一个写锁,这个锁会阻止其他事务对数据库进行修改。
只有当一个事务提交或回滚后,其他事务才能获取写锁。
这种锁机制可以确保事务的隔离性,防止多个事务同时对数据库进行修改,从而避免了数据不一致的情况。
SQLite使用了持久化技术来保证事务的持久性。
持久化是指在事务提交后,对数据库的修改操作将永久保存在存储介质上。
在SQLite 中,当一个事务提交后,它的修改操作会被写入数据库文件中,并且通过一些机制来确保这些修改操作能够在数据库崩溃或断电后仍然有效。
sqlite使用说明
![sqlite使用说明](https://img.taocdn.com/s3/m/864b2ad77f1922791688e85a.png)
Sqlite使用说明一、简介:SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。
事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。
下面我们将列举一下SQLite的主要特征:1. 管理简单,甚至可以认为无需管理。
2. 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。
3. 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
4. 易于维护。
综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。
SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL 语句等。
正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。
二、SQLite的主要优点:1. 一致性的文件格式:在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。
与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。
2. 在嵌入式或移动设备上的应用:由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。
3. 内部数据库:在有些应用场景中,我们需要为插入到数据库服务器中的数据进行数据过滤或数据清理,以保证最终插入到数据库服务器中的数据有效性。
SQLite的介绍操作Sqlite具体实例
![SQLite的介绍操作Sqlite具体实例](https://img.taocdn.com/s3/m/2304116b26d3240c844769eae009581b6bd9bdd1.png)
SQLite的介绍操作Sqlite具体实例1.SQLite简介SQLite是⼀款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计⽬标是嵌⼊式的,⽽且⽬前已经在很多嵌⼊式产品中使⽤了它,它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了。
它能够⽀持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如Tcl、PHP、Java、C++、.Net等,还有ODBC接⼝,同样⽐起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度⽐他们都快。
2.SQLite的特点:轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。
使⽤SQLite⼀般只需要带上它的⼀个动态库,就可以享受它的全部功能。
⽽且那个动态库的尺⼨也挺⼩,以版本3.6.11为例,Windows下487KB、Linux下347KB。
不需要"安装"SQLite的核⼼引擎本⾝不依赖第三⽅的软件,使⽤它也不需要"安装"。
有点类似那种绿⾊软件。
单⼀⽂件数据库中所有的信息(⽐如表、视图等)都包含在⼀个⽂件内。
这个⽂件可以⾃由复制到其它⽬录或其它机器上。
跨平台/可移植性除了主流操作系统 windows,linux之后,SQLite还⽀持其它⼀些不常⽤的操作系统。
弱类型的字段同⼀列中的数据可以是不同类型开源3.SQLite数据类型⼀般数据采⽤的固定的静态数据类型,⽽SQLite采⽤的是动态数据类型,会根据存⼊值⾃动判断。
SQLite具有以下五种常⽤的数据类型:NULL: 这个值为空值VARCHAR(n):长度不固定且其最⼤长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的⼤⼩可以依次被存储为1,2,3,4,5,6,7,8.REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 值为⽂本字符串,使⽤数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据块,以输⼊的数据格式进⾏存储。
sqlite 用法
![sqlite 用法](https://img.taocdn.com/s3/m/e494dfd60342a8956bec0975f46527d3240ca6b8.png)
sqlite 用法SQLite是一种轻型关系型数据库管理系统,它是一个C语言库,实现了自给自足、无服务器、零配置、事务性的SQL数据库引擎。
SQLite不需要单独的服务器进程或操作系统支持,这使它成为嵌入式数据库的理想选择,也适用于客户端/服务器的数据库应用程序。
SQLite的文件格式跨平台,可以在不同的操作系统中共享。
SQLite 的应用非常广泛,包括Android、iOS、Windows、Linux等系统中的各种应用程序和网站。
SQLite的使用非常简单,只需要引入SQLite的头文件,然后使用相应的API即可实现数据库的连接、数据的插入、查询、更新和删除等操作。
SQLite的API包含在sqlite3.h头文件中,其中最常用的API包括:sqlite3_open()用于连接数据库,sqlite3_exec()用于执行SQL语句,sqlite3_prepare_v2()用于准备SQL语句,sqlite3_step()用于执行SQL语句的下一步,sqlite3_finalize()用于释放已准备好的SQL语句,sqlite3_close()用于关闭数据库连接等。
在SQLite中,数据存储在表中,每个表由一组列组成。
表的创建可以使用SQL语句CREATE TABLE,格式为:CREATE TABLE 表名 (列1名列1类型, 列2名列2类型, …) 例如:CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)这个语句创建了一个名为“user”的表,包含三列:id、name和age。
其中,id列为主键,类型为INTEGER,name列和age列分别为TEXT和INTEGER类型。
表的数据可以通过INSERT INTO语句进行插入,例如:INSERT INTO user (name, age) VALUES ('Tom', 20) 这个语句向user表中插入了一条记录,name列的值为“Tom”,age列的值为20。
sqlite 的类型
![sqlite 的类型](https://img.taocdn.com/s3/m/8bb2e15e5e0e7cd184254b35eefdc8d376ee14bd.png)
sqlite 的类型
SQLite是一种轻量级的关系型数据库管理系统,它支持多种数据类型,这些数据类型包括:
1. NULL,表示一个值是空的。
2. INTEGER,用于存储整数值,可以是1、2、3等等,也可以是负数。
3. REAL,用于存储浮点数值,例如3.14、-0.5等。
4. TEXT,用于存储文本字符串,比如"Hello, World"。
5. BLOB,用于存储二进制数据,比如图片、音频、视频等。
除了基本的数据类型外,SQLite还支持日期和时间函数,以及对日期和时间的存储和计算。
这些数据类型的灵活性使得SQLite能够满足各种不同类型的数据存储需求。
另外,SQLite是一种动态类型的数据库,也就是说在SQLite
中,每个值都具有类型,但是数据类型是可以动态改变的。
这意味
着你可以在同一列中存储不同类型的数据,虽然这种做法并不常见,但是在某些情况下是有用的。
总的来说,SQLite的数据类型丰富多样,能够满足各种不同的
数据存储需求,同时也具有一定的灵活性,使得它成为了一个受欢
迎的数据库管理系统。
sqlite的缓存机制
![sqlite的缓存机制](https://img.taocdn.com/s3/m/eb397a08777f5acfa1c7aa00b52acfc789eb9f27.png)
sqlite的缓存机制SQLite 的缓存机制是其性能优化的关键部分,主要涉及以下几个方面:1.Page Cache (也称为Pager):o SQLite 使用一个称为“Page Cache”的内存区域来存储数据库文件的数据。
这个缓存区域用于存储从磁盘读取的数据页面。
o每个SQLite 数据库都有一个或多个Pager 对象,这些对象管理着数据库文件的读写操作。
o Pager 负责缓存、回收和重新使用内存中的数据页面。
它还负责将数据从缓存同步回磁盘文件。
2.Page Size:o SQLite 的默认页面大小是4096 字节,但可以通过PRAGMA page_size命令或sqlite3_config()函数进行调整。
o页面大小会影响缓存的效率,因为如果一个操作涉及多个页面,则较大的页面大小可能会减少页面切换的次数。
3.Shared Cache Model:o SQLite 支持多个数据库共享同一个Page Cache。
这是通过称为“Shared Page Cache”的机制实现的。
o在多线程或多进程环境中,多个数据库可以共享相同的内存缓存,这有助于减少内存使用和提高性能。
4.WAL Mode (Write-Ahead Logging):o从SQLite 3.7.0 开始,WAL 模式成为默认的事务模式。
在WAL 模式下,写操作首先记录在日志文件中,然后在稍后的某个时间点应用到主数据库文件。
o WAL 模式的好处是允许多个读取操作并发进行,而不会与写入操作冲突。
这有助于提高并发性能。
5.Synchronous Write:o通过使用PRAGMA synchronous命令或sqlite3_config()函数,可以调整同步写入级别。
默认情况下,SQLite 是同步的,这意味着在写入操作完成之前,它会等待磁盘I/O 完成。
这样可以保证数据完整性,但可能会影响性能。
o通过降低同步级别,SQLite 可以更快地写入数据,但可能会牺牲一些数据完整性。
SQLite数据库利用详解程序
![SQLite数据库利用详解程序](https://img.taocdn.com/s3/m/d87441de32d4b14e852458fb770bf78a64293a59.png)
1.SQLite数据库的优势:1.1 轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,利用SQLite一样只需要带上它的一个动态库。
以版本为例,Windows下487KB、Linux下347KB。
1.2 绿色软件它的核心引擎本身不依托第三方的软件1.3 单一文件确实是数据库中所有的信息(比如表、视图、触发器、等)都包括在一个文件内。
那个文件能够copy到其它目录或其它机械上,也照用不误。
CSV也是单一文件格式。
它本身确实是用来表示二维的数据信息的。
一个CSV文件能够明白得为数据库的一张表。
CSV的缺点要紧在于:不便于存储非文本的数据信息(比如BLOB类型的信息);若是需要同时存储多张表的信息,就需要对应有多个CSV文件(文件一多,就嫌麻烦)。
1.4 跨平台/可移植性除主流操作系统,SQLite还支持了很多其他的操作系统。
如对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。
Access数据库最要紧的缺点确实是不能跨平台。
另外还有几个小缺点:文件大小有限制(2GB)、不支持内存数据库。
1.5 内存数据库(in-memory database)现在内存愈来愈廉价,很多一般PC都开始以GB为单位来衡量内存(效劳器就更甭提了)。
这时,SQLite的内存数据库特性就越发显得好用。
SQLite的API不区分当前操作的数据库是在内存仍是在文件(关于存储介质是透明的)。
因此若是你感觉磁盘I/O有可能成为瓶颈的话,能够考虑切换为内存方式。
切换的时候,操作SQLite的代码大体不用大改,只要在开始时把文件Load到内存,终止时把内存的数据库Dump回文件就OK了。
1.6 编程语言接口由于SQLite本身是C写的,它自带的API也是C接口的。
2.SQLite数据库的缺点:2.1并发访问的锁机制SQLite在并发(包括多进程和多线程)读写方面的性能不太理想。
sqlite原理
![sqlite原理](https://img.taocdn.com/s3/m/2b3ae948f4335a8102d276a20029bd64783e6215.png)
sqlite原理
SQLite是一种轻量级的关系型数据库管理系统。
它被设计成具有嵌入式数据库引擎的功能,因此它可以被集成到其他应用程序中作为一个本地库使用。
SQLite不需要独立的服务器进程或系统守护进程,因为它是一个自包含的库,并且可以直接访问磁盘上的数据文件。
SQLite使用了一种称为B树的数据结构来存储数据。
B树是一种自平衡的树形数据结构,它允许在平均情况下快速的查找、插入和删除操作。
SQLite的B树是一种多路平衡搜索树,它可以有多个子节点,这使得它可以在一次磁盘访问中处理多个数据项。
SQLite的数据文件是一个二进制文件,它包含一个或多个B树,每个B树对应一个表或索引。
每个表或索引的数据都被存储在一个或多个B树中,并且被组织成一系列的页。
每个页都是一个固定大小的块,通常为4KB。
页可以是数据页,也可以是索引页。
SQLite的查询处理器使用了一种称为虚拟机的技术。
查询处理器首先将SQL语句转换成一系列的操作码,然后将这些操作码输入到虚拟机中执行。
虚拟机将执行一个或多个子程序,它们会访问数据库的B树,从而完成查询操作。
SQLite的事务处理使用了基于日志的技术。
当一个事务被提交时,SQLite会将所有对数据的修改记录到一个日志文件中。
如果系统崩溃或出现其他错误,SQLite可以使用这个日志文件来恢复数据库的状态。
总之,SQLite是一种轻量级的关系型数据库管理系统,它使用B
树数据结构来存储数据,使用虚拟机技术来执行查询操作,使用基于日志的技术来处理事务。
它的特点是体积小、速度快、易于使用。
sqlite应用场景
![sqlite应用场景](https://img.taocdn.com/s3/m/81024730b6360b4c2e3f5727a5e9856a57122676.png)
sqlite应用场景SQLite是一种轻量级的关系型数据库管理系统,它广泛应用于各种领域。
本文将从以下几个方面详细介绍SQLite的应用场景。
一、移动端应用SQLite因其轻量级、高效、易于集成等特点在移动端应用中被广泛使用。
比如,安卓系统中的联系人、通话记录、短信等数据均储存在SQLite数据库中。
除了系统自带的功能,许多安卓应用都使用SQLite作为其本地储存方式。
而iOS系统中也采用SQLite作为内置数据库,应用开发者也可以使用SQLite对App中各种数据进行储存和管理。
二、桌面应用SQLite也可以在桌面应用程序中被广泛使用。
由于其轻量级特点,SQLite极易部署和集成到各种桌面应用程序中,并且可以实现高效的本地数据储存和管理。
比如,许多常用的桌面应用程序,如编辑器、图片管理器、音乐播放器等都采用SQLite作为其本地数据库储存方式,提供用户便捷的本地数据管理功能。
三、嵌入式系统在嵌入式系统领域,由于SQLite占用的存储空间极小,且具有高效的数据查询、处理能力,因此SQLite也经常被应用在嵌入式系统中。
比如,许多智能家居、智能穿戴等IoT设备都使用SQLite作为其本地数据库储存方式,提供设备数据管理和本地应用程序的支持。
四、Web应用虽然SQLite主要是用于本地应用储存数据,但也可以在Web应用中被使用。
我们可以使用SQLite提供的API和语法操作数据库表。
SQLite借助Php中的PDO类支持,可使用SQLite操作Web项目中的数据存储,而且由于SQLite数据占用很少的磁盘空间,所以这个不会增加服务器负载。
总而言之,SQLite应用场景十分广阔,它适用于各种不同的应用场景,并且可以轻松部署和集成到不同的应用程序之中。
无论是移动端应用还是桌面应用、嵌入式系统,SQLite的高效、易用、灵活的特点都让它成为了广大开发者的首选之一。
SQLITE源码分析
![SQLITE源码分析](https://img.taocdn.com/s3/m/f5d75c261fd9ad51f01dc281e53a580217fc5070.png)
SQLITE源码分析SQLite是一个轻量级的关系型数据库管理系统,它的源码可以用C 语言编写。
在进行SQLite源码分析时,需要了解以下几个主要方面:1. 数据库文件格式:SQLite的数据存储在一个单一的文件中,文件中包含了一个或多个表格,每个表格又包含多个行和列。
文件格式采用了一种称为B树的数据结构,它能够高效地进行数据的插入、删除和查找操作。
2. 内存管理:SQLite使用了自己的内存管理系统,它通过使用一个称为“mem5”的内存分配器来管理内存。
这个内存分配器可以将整个虚拟内存空间划分为多个固定大小的块,以降低内存碎片化的程度,提高内存分配的效率。
3. SQL解析和优化:SQLite使用了一个称为Lemon的工具来生成SQL解析器。
Lemon根据输入的语法规则生成一个状态机,并根据状态机解析输入的SQL语句。
一旦SQL语句被解析成功,SQLite会进行一系列的优化操作,例如重写查询计划、生成执行计划等。
4. 查询执行:SQLite的查询执行主要包括四个阶段:编译、优化、执行和返回结果。
编译阶段主要负责将SQL语句进行解析和编译成一个执行计划。
优化阶段对执行计划进行一系列的优化操作,例如选择最佳的索引、重写查询计划等。
执行阶段负责执行编译和优化生成的执行计划,并将结果返回给调用者。
5. 事务处理:SQLite支持ACID事务,它使用一个称为WAL(Write-Ahead-Logging)的机制来实现事务的持久化。
WAL允许多个读操作和一个写操作并发地访问数据库,从而提高了多用户并发访问数据库的效率。
总结来说,SQLite的源码分析涉及数据库文件格式、内存管理、SQL 解析和优化、查询执行和事务处理等多个方面。
在分析源码时,可以从这些方面入手,深入了解SQLite的工作原理和实现细节。
同时,由于SQLite源码较为庞大和复杂,建议阅读相关的文档和资料,以提高分析效率和理解深度。
sqlite 基本操作
![sqlite 基本操作](https://img.taocdn.com/s3/m/1bed5750571252d380eb6294dd88d0d233d43c6e.png)
sqlite 基本操作SQLite是一种轻量级的关系型数据库管理系统,它提供了一套简单易用的操作接口,使得开发者可以方便地进行数据库的创建、查询、更新和删除等基本操作。
本文将介绍SQLite的基本操作,包括数据库的创建与连接、表的创建与删除、数据的插入与查询、数据的更新与删除等内容。
一、数据库的创建与连接1. 创建数据库:使用SQLite提供的命令或者API,可以创建一个新的数据库文件。
可以指定数据库文件的路径和名称,也可以使用默认的名称。
2. 连接数据库:连接数据库是指在应用程序中与数据库建立起通信的通道。
通过连接数据库,可以执行后续的操作,包括创建表、插入数据、查询数据等。
二、表的创建与删除1. 创建表:在数据库中,表是用于存储数据的结构化对象。
通过使用SQLite提供的命令或者API,可以创建一个新的表。
在创建表时,需要指定表的名称和表的字段,以及每个字段的类型和约束。
2. 删除表:当不再需要某个表时,可以使用SQLite提供的命令或者API,将其从数据库中删除。
删除表的操作将会删除表中的所有数据,因此在执行删除操作前应慎重考虑。
三、数据的插入与查询1. 插入数据:在已创建的表中,可以通过使用SQLite提供的命令或者API,向表中插入新的数据。
插入数据时,需要指定数据要插入的表和字段,以及每个字段对应的值。
2. 查询数据:查询数据是使用SQLite最常见的操作之一。
通过使用SQLite提供的命令或者API,可以从表中检索出满足特定条件的数据。
查询操作可以使用各种条件和操作符,以及排序和分组等功能。
四、数据的更新与删除1. 更新数据:在已有的表中,可以使用SQLite提供的命令或者API,更新表中的数据。
更新数据时,需要指定要更新的表和字段,以及每个字段对应的新值。
可以使用各种条件和操作符,以确定要更新的数据行。
2. 删除数据:删除数据是使用SQLite的另一个常见操作。
通过使用SQLite提供的命令或者API,可以从表中删除满足特定条件的数据。
sqlite介绍
![sqlite介绍](https://img.taocdn.com/s3/m/fa647ff451e2524de518964bcf84b9d528ea2cf8.png)
sqlite介绍SQLite是一种轻量级的关系型数据库管理系统。
它不需要运行在独立的服务器上,它是一个嵌入式数据的数据库引擎。
SQLite是在遵循BSD许可证下发布的自由软件,可以在商业软件中免费使用。
SQLite 的默认API是基于SQL92标准的,其访问控制是基于文件的,没有服务器进程,使用起来非常简单方便,可以在需要快速开发的应用程序中使用。
SQLite主要特点包括:1、轻量级:SQLite是单库文件,体积小,经过压缩后仅有几百KB,非常适合轻量级的应用场景。
它的小巧尺寸和高效使用,将使它在应用程序领域得到广泛的应用。
2、嵌入式:SQLite不需要安装,在应用程序中直接使用即可,这是非常方便的。
因此,SQLite适用于嵌入到其他应用程序中,例如桌面应用程序、移动应用程序、计算器等。
3、SQL兼容性:SQLite支持大部分SQL语法,如SELECT,INSERT,UPDATE,DELETE等SQL语句,以及索引、存储过程、触发器等高级特性,能够满足大部分应用程序的需求。
4、跨平台:SQLite可以在Windows、Linux、Android、iOS等操作系统上运行,且原项目支持20多编程语言(例如: C、C++、Java、Python、Perl、Ruby)。
对于移动应用开发者来说,SQLite是一个理想的选择。
5、高效性:SQLite是一种非常高效的数据库管理系统,它可以快速的插入和读取数据,同时还支持多线程和事务操作,这样可以保证数据的安全性和一致性。
也正因为这些特点,SQLite成为许多应用程序的前端数据库。
6、可靠性: SQLite的存储引擎使用完整性和稳定性方面的技术,和其它数据管理系统一样能确保数据无损坏。
SQLite支持原子性、一致性、隔离性和持久性,能够确保在任何情况下,数据都不会丢失或错误。
综上所述,SQLite是一种非常优秀的关系型数据库管理系统,它支持SQL语法,具有嵌入式、高效性、可靠性、跨平台及轻量级等优点,所以在很多应用程序中都被广泛使用。
sqlite 原理
![sqlite 原理](https://img.taocdn.com/s3/m/9711de5e00f69e3143323968011ca300a6c3f614.png)
sqlite 原理SQLite是一种轻型、自包含的关系型数据库管理系统,使用C语言编写,其设计重点是小型型和嵌入式应用领域。
SQLite是一个开源的软件,它的数据库文件可以跨平台使用,是许多应用程序中经常使用的数据库。
SQLite的特点:1. 轻量级:SQLite相对于其他数据库而言,它的体积很小,可以很容易地集成到其他应用程序中,并且占用的内存较小。
2. 简单易用:SQLite的语法非常简洁明了,操作也很方便,即使是新手也可以很快上手。
3. 稳定可靠:SQLite的数据存储是基于文件,这种存储方式非常稳定可靠,即使在系统崩溃的情况下也不会出现数据丢失的情况。
4. 高性能:SQLite的读写速度非常快,在数据量较小的情况下,可以达到很高的读写性能。
SQLite的原理:1. 数据存储:SQLite的存储方式是基于文件的,其数据存储在一个文件中,这个文件的扩展名为.db。
每个数据库文件中可以包含多个表,每个表包含多行数据,以及每行数据对应的多个列。
2. 数据类型:SQLite支持的数据类型包括NULL、INTEGER、REAL、TEXT和BLOB。
其中,INTEGER可以存储整数值,REAL可以存储浮点数值,TEXT可以存储字符串,BLOB可以存储二进制数据。
3. 数据查询语句:SQLite的查询语句是基于SQL语言的,查询语句中可以包含SELECT、FROM、WHERE等关键字。
例如,SELECT * FROM table_name WHERE column_name = 'value',这个查询语句表示从名为table_name的表中获取所有行的数据,并且其中column_name列的值等于'value'。
4. 数据索引:为了使SQLite的查询速度更快,可以在表中创建索引。
索引可以加快数据查询的速度,但是索引也会降低插入和更新数据的速度。
在SQLite中,可以使用CREATE INDEX语句来创建索引。
sqlite3源码解析
![sqlite3源码解析](https://img.taocdn.com/s3/m/1d176762e418964bcf84b9d528ea81c759f52e75.png)
sqlite3源码解析SQLite是一个轻量级的关系型数据管理系统,是一种嵌入式数据库。
其主要特点是开源、高性能、轻便,广泛应用于各种移动应用、桌面应用等场景。
SQLite的核心源码是由C语言编写的,其开发维护团队较小,因此对其源码进行深入分析可以帮助我们更好地了解SQLite的内部实现机制。
SQLite3是SQLite的第三个版本,其源码具备可读性强以及代码规范好的特点。
本文将重点解析SQLite3源码的数据结构和操作流程。
一、SQLite3的源码结构SQLite3源码的目录结构如下:```- src/|-sqlite3.c # SQLite3代码主体|-sqlite3.h # SQLite3头文件|-vdbe.c # SQLite3虚拟机引擎代码|-vdbe.h # SQLite3虚拟机引擎头文件|-btree.c # SQLite3的B-tree数据结构代码|-btree.h # SQLite3的B-tree数据结构头文件|-pager.c # SQLite3的页面管理代码|-pager.h # SQLite3的页面管理头文件|-sqliteInt.h # SQLite3内部头文件```其中,**sqlite3.c**是SQLite3的核心代码文件,其他文件则实现SQLite3功能的不同模块,如B-tree数据结构、页面管理等模块。
二、SQLite3的数据结构SQLite3在实现关系型数据管理系统的同时,使用了许多相关的数据结构,如B-tree、Hash表等。
下面介绍SQLite3源码中的两个重要的数据结构:B-tree和数据库对象。
B-tree:SQLite3使用B-tree实现关系型数据库的索引和访问,B-tree是一种平衡树结构,其特点是每一个节点都有多个子节点。
在SQLite3中,B-tree是由一个或多个页面组成的一个页面链,每一个页面中可以存储多个关键字和相应的数据指针。
数据库对象:在SQLite3中,数据库对象是一种指向数据库文件的文件指针。
sqlite源码解析
![sqlite源码解析](https://img.taocdn.com/s3/m/2fa5294c7dd184254b35eefdc8d376eeaeaa17a5.png)
sqlite源码解析摘要:1.SQLite 简介2.SQLite 源码结构3.SQLite 主要功能模块3.1 数据库连接与操作3.2 SQL 解析与执行3.3 数据库文件管理3.4 错误处理与日志记录4.SQLite 源码解析实例4.1 磁盘文件格式4.2 事务处理4.3 索引与查询优化5.SQLite 的优点与应用场景正文:SQLite 是一款轻量级的关系型数据库,它将整个数据库存储在一个磁盘文件中。
SQLite 的源代码结构清晰,易于阅读和理解。
下面将从SQLite 的源码结构、主要功能模块以及源码解析实例等方面进行介绍。
首先,简要介绍一下SQLite。
SQLite 是一个开源的、自给自足的数据库引擎,它的设计目标是提供一种嵌入式的、自给自足的数据库系统。
SQLite 的磁盘文件格式简单,数据存储紧凑,易于实现事务处理和查询优化。
接下来,我们来看一下SQLite 源码的结构。
SQLite 的源代码主要包括以下几个模块:1.db:数据库连接与操作模块。
该模块负责处理数据库的连接、关闭、备份等操作。
2.parser:SQL 解析与执行模块。
该模块负责解析SQL 语句,并将其转换为可执行的虚拟机代码。
3.diskio:数据库文件管理模块。
该模块负责处理数据库文件的读写操作,包括磁盘文件格式的实现和数据存储的管理。
4.error:错误处理与日志记录模块。
该模块负责处理数据库操作过程中的错误,并记录相关日志信息。
下面,我们通过几个实例来解析SQLite 的源码。
首先,磁盘文件格式。
SQLite 的磁盘文件格式非常简单,它由一个固定的磁盘头和多个数据页组成。
磁盘头包含了一些元数据信息,如数据库的版本号、创建时间等。
数据页则是实际存储数据的地方,每个数据页的大小是固定的。
其次,事务处理。
SQLite 支持事务处理,它可以保证数据库操作的一致性和完整性。
在SQLite 的源码中,事务处理是通过一个事务对象来实现的。
sqlite面试题
![sqlite面试题](https://img.taocdn.com/s3/m/315ce91476232f60ddccda38376baf1ffc4fe32b.png)
sqlite面试题SQLite是一种嵌入式关系型数据库管理系统,它被广泛应用于移动应用和小型系统中。
在SQLite的面试过程中,面试官通常会提问一些与SQLite相关的问题,以考察应聘者的数据库基础知识和相关实际应用经验。
本文将介绍一些常见的SQLite面试题,并提供详细的解答,帮助读者更好地理解SQLite的特性和使用。
1. 什么是SQLite?它有哪些特点?SQLite是一种轻量级的嵌入式关系型数据库管理系统,被设计为零配置和零管理的数据库。
它以库文件的形式存在,可以被嵌入到应用程序中,不需要独立的数据库服务器。
SQLite具有以下特点:- 零配置:不需要额外的配置或安装过程,只需引入SQLite库文件即可开始使用数据库。
- 高性能:SQLite使用内存数据库的技术,具有非常高的速度和响应能力。
- 小巧灵活:SQLite库文件大小仅几百KB,非常适合嵌入到移动应用和资源有限的系统中。
- 跨平台:SQLite支持多种操作系统和编程语言,如Windows、Linux、iOS、Android以及C、Java、Python等。
- ACID事务支持:SQLite支持事务的原子性、一致性、隔离性和持久性,并提供回滚和恢复机制。
2. SQLite与其他关系型数据库的区别是什么?SQLite与传统的关系型数据库管理系统(如MySQL、Oracle)相比,有以下几点区别:- 部署方式:SQLite作为嵌入式数据库,以库文件的形式存在并被应用程序直接调用;而传统关系型数据库通常需要单独安装和配置数据库服务器。
- 扩展性:SQLite适用于小型系统和轻量级应用,对于大型数据集和高并发访问的场景相对不够强大,而传统关系型数据库具备更好的扩展能力。
- 功能丰富度:SQLite虽然提供了关系型数据库基本功能,但在某些高级功能上可能会有所缺失,如存储过程、触发器等。
而传统关系型数据库提供了更丰富和完善的功能集合。
- 性能表现:由于SQLite使用的是文件系统而非网络访问,不需要网络传输的开销,因此在某些场景下可以获得更好的性能表现。
sqlite 二进制
![sqlite 二进制](https://img.taocdn.com/s3/m/3bfc244e26284b73f242336c1eb91a37f0113259.png)
sqlite 二进制SQLite二进制:探索SQLite数据库的二进制文件SQLite是一种轻量级的关系型数据库管理系统,它被广泛应用于移动设备和嵌入式系统中。
SQLite的二进制文件是SQLite数据库的核心组成部分,它包含了数据库的所有数据和元数据。
在本文中,我们将探索SQLite二进制文件的结构和内容,以及如何使用它们来管理SQLite数据库。
SQLite二进制文件的结构SQLite二进制文件是一个二进制格式的文件,它包含了数据库的所有数据和元数据。
它由多个数据块组成,每个数据块都有一个特定的目的。
以下是SQLite二进制文件的主要数据块:1. 文件头:文件头包含了SQLite数据库的基本信息,如文件格式版本、页大小、文件大小等。
2. 数据页:数据页是SQLite数据库中存储数据的基本单位。
每个数据页包含了一个或多个数据行,每个数据行都包含了一个或多个数据列。
3. 索引页:索引页是SQLite数据库中存储索引的基本单位。
每个索引页包含了一个或多个索引项,每个索引项都包含了一个或多个索引键。
4. 自由块:自由块是SQLite数据库中未使用的空间。
当数据页或索引页被删除时,它们的空间将被添加到自由块中,以供后续使用。
5. WAL文件:WAL文件是SQLite数据库中的Write-Ahead Logging文件,它用于记录数据库的变更。
WAL文件包含了一系列的日志记录,每个日志记录都包含了一个或多个变更操作。
SQLite二进制文件的内容SQLite二进制文件包含了数据库的所有数据和元数据。
以下是SQLite二进制文件的主要内容:1. 数据:数据是SQLite数据库中存储的实际数据。
它可以是文本、数字、日期等类型的数据。
2. 元数据:元数据是SQLite数据库中描述数据的信息。
它包括表、列、索引、触发器等对象的定义。
3. 索引:索引是SQLite数据库中用于加速查询的数据结构。
它可以是B树、B+树等类型的索引。
SQLite数据库简介和使用
![SQLite数据库简介和使用](https://img.taocdn.com/s3/m/ca80ca39f011f18583d049649b6648d7c1c70819.png)
SQLite数据库简介和使⽤⼀、Sqlite简介: SQLite (/),是⼀款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计⽬标是嵌⼊式的,⽽且⽬前已经在很多嵌⼊式产品中使⽤了它,它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了。
它能够⽀持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如 Tcl、C#、PHP、Java等,还有ODBC接⼝,同样⽐起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度⽐他们都快。
SQLite第⼀个Alpha版本诞⽣于2000年5⽉.⾄今已经有10个年头,SQLite也迎来了⼀个版本 SQLite 3已经发布。
⼆、Sqlite作者赠⾔: o May you do good and not evil. 愿你⾏善莫⾏恶 o May you find forgiveness for yourself and forgive others. 愿你原谅⾃⼰宽恕他⼈ o May you share freely, never taking more than you give. 愿你宽⼼与⼈分享,所取不多于你所施予三、Sqlite的命令: sqlite3 too.db 创建名为too的数据库,其后缀不⼀定⽤db .Help 求助 .quit 离开四、Sqlite的客户端⼯具: SQLiteExpertPers六、Sqlite的sql语句:建表:create table table_name(field1, field2, field3, ...); 例⼦:创建名为film的数据库表 create table film(_id Integer primaray key autoincrement , title, length, year, starring);注意:语句要以分号结尾,字段不⽤指定类型,它会适时的⾃动转换 可以存储⽂字、数字、⼤⽂本(blub)创建索引:create index index_name on table_name(field_to_be_indexed); 例⼦:针对表film的title字段创建名为film_title_index的索引 create index film_title_index on film(title); 注意:当表的数据较多时,索引能加快查询速度(前提是根据建有索引的字段查询)添加数据:insert into table_name(field1,field2,field3,...) values(data1, data2, data3, ...); 例⼦:向表film中添加⼀条记录 insert into film(title, length, year, starring) values('Contact',153,1997,'Jodie Foster'); 注意:可以省略语句中的字段名部分,前提是数据个数与字段个数⼀样 如果某个字段没有添加值则其值为null,也可⼿动添加null值查询数据:select columns from table_name where expression; 例⼦:从表film中查询数据 1 显⽰表⾥所有字段的所有数据 select * from film; 2 如果资料太多了,我们或许会想限制笔数: select * from film limit 10; 3 照着电影年份来排列: select * from film order by year limit 10; 4 年份⽐较近的电影先列出来: select * from film order by year desc limit 10; 5 我们只想看电影名称跟年份: select title, year from film order by year desc limit 10; 6 查所有茱蒂佛斯特演过的电影: select * from film where starring='Jodie Foster'; 7 查所有演员名字开头叫茱蒂的电影('%' 符号便是 SQL 的万⽤字符): select * from film where starring like 'Jodie%'; 8 查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多⼗笔,只列出电影名称和年份: select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10; 9 查看数据库⼀共有多少条记录: select count(*) from film; 10 查看1985年以后的电影有⼏部: select count(*) from film where year >= 1985;更新数据:update film set starring='Jodie Foster' where starring='Jodee Foster'; 把主⾓字段为'Jodee Foster'的所有记录改成Jodie Foster。
sqlite数据库使用方法
![sqlite数据库使用方法](https://img.taocdn.com/s3/m/b6492835a517866fb84ae45c3b3567ec102ddcf5.png)
sqlite数据库使用方法SQLite 是一个轻量级的嵌入式数据库,与传统的客户端/服务器模式的数据库不同,它是一个库,直接与程序链接,而不是通过网络与一个单独的进程交互。
下面是 SQLite 的使用方法的详细介绍:1. 安装 SQLite2.创建数据库使用 SQLite 前,需要先创建一个数据库文件。
在命令提示符中,可以使用以下命令创建一个新的数据库文件:``````这个命令将创建一个名为 `database.db` 的数据库文件。
如果文件不存在,则会自动创建。
如果文件已经存在,则会打开现有的数据库文件。
3.创建表创建表是存储数据的基本单元。
在 SQLite 中,可以使用 `CREATE TABLE` 命令来创建一个新的表。
以下是一个创建表的示例:```CREATE TABLE studentsid INTEGER PRIMARY KEY,name TEXT,age INTEGER```这个命令将创建一个名为 `students` 的表,包含三个列:`id`、`name` 和 `age`。
`id` 列是一个整数类型的主键,`name` 列是一个文本类型,`age` 列是一个整数类型。
4.插入数据插入数据是把数据添加到数据库表中的过程。
在 SQLite 中,可以使用 `INSERT INTO` 命令来插入数据。
以下是一个插入数据的示例:```INSERT INTO students (name, age) VALUES ('Alice', 20);INSERT INTO students (name, age) VALUES ('Bob', 22);INSERT INTO students (name, age) VALUES ('Charlie', 21);```这个命令将分别插入三条数据到 `students` 表中。
5.查询数据查询数据是从数据库表中获取数据的过程。
SQLite数据库管理指南
![SQLite数据库管理指南](https://img.taocdn.com/s3/m/5227d211e418964bcf84b9d528ea81c759f52e70.png)
SQLite数据库管理指南第一章:SQLite简介与安装SQLite是一种轻量级、嵌入式的关系型数据库管理系统,它占用系统资源少、易于使用和维护。
在本章中,我们将介绍SQLite 的基本特性以及如何安装和配置它。
1.1 SQLite的特点SQLite具有以下特点:- 无服务器架构:SQLite是一种嵌入式数据库,不需要独立的服务器进程,可以直接在应用程序中使用。
- 零配置:SQLite不需要额外的配置或管理,数据库文件直接存储在磁盘上。
- 零维护:SQLite自动处理数据库的创建、重命名以及备份等操作。
- 跨平台:SQLite可以在不同的操作系统上运行,包括Windows、macOS和Linux等。
1.2 安装SQLite安装SQLite非常简单,只需要下载对应操作系统的预编译二进制文件,并将其添加到系统的PATH环境变量中即可。
也可以选择使用各种集成开发环境(IDE)来安装SQLite。
第二章:SQLite数据库操作在本章中,我们将介绍如何创建、删除、备份和还原SQLite数据库,并演示常见的SQL操作,如表的创建、插入、查询和更新等。
2.1 创建数据库通过SQLite的命令行工具或编程语言的SQLite API,可以创建一个新的SQLite数据库。
使用SQLite命令行工具的示例命令如下:```sqlite3 test.db```此命令将在当前目录下创建名为test.db的数据库文件,并进入SQLite控制台。
2.2 数据库备份与还原SQLite提供了命令行工具和API来备份和还原数据库。
使用命令行工具的示例命令如下:```sqlite3 test.db .backup backup.db```此命令将备份test.db数据库到名为backup.db的文件中。
2.3 数据库表操作SQLite使用SQL语言来操作数据库表。
以下是一些常见的表操作示例:- 创建表:```CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);```- 插入数据:```INSERT INTO students (name, age) VALUES ('John', 20);```- 查询数据:```SELECT * FROM students;```- 更新数据:```UPDATE students SET age = 21 WHERE name = 'John';```第三章:SQLite性能优化SQLite虽然是一个轻量级数据库,但在大数据量和高并发的情况下,也需要进行性能优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈SQLite:实现与应用1、前言有一些日子没有仔细关注SQLite了,今天打开其主页,发现其最新的版本已经是3.6.22了,更让我惊喜的是它的用户越来越多,而且邮件列表的关注者也越来越多,突然觉得自己已经太old了。
惊喜的同时,不得不聊上几句了。
首先,来看看都有哪些人在使用SQLite,主页上列举一长串NB的用户,其中不乏像Adobe,Apple,Firefox,甚至连google,Microsoft,SUN这样的用户。
Firefox:这是我的机器上V3.5.7安装目录下的文件:可以发现用的SQLite 3.6.16.1。
据说,Google在它的Desktop for Mac,Google Gears,以及Android,甚至Chrome 中都用到SQLite,而且,Google的工程师对SQLite的全文检索功能作了很大的贡献(contribution)。
还有Apple,Micorsoft,SUN等等,这里就不列举了。
详细见/famous.html。
有这些公司的参与,对SQLite的发展应该有很大的帮助,尤其是像Google这样的用户。
2、实现与应用下面从实现及应用的角度来谈谈SQLite,先看看SQLite的特点(功能)吧。
特点简单(simple):SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS:一个头文件,一个动态库文件,你就拥有了关系数据库的所有功能了。
简单,是SQLite最明显的哲学。
它提供的API少而简单。
只需要一个DLL文件,你的程序马上就拥有了一个功能强大的数据库引擎,这是一件很美妙的事。
小巧(small):我用VS 2005在Windows下编译的3.6.11,Release版为368K,用时不到20秒——而编译MySQL时,要花上几分钟。
而当我插入10000条int数据时,内存开销660K,磁盘开销92K。
事务(transaction):事务是现代商业数据处理系统最基本的要求,而Access,不论是在可执行文件大小(看了一下Access2003的可执行文件大小为6.32M,两者不是一个量级),还是事务特性,都是不能和SQLite 相比的。
并发性(Concurrency):由于SQLite通过OS的文件锁来实现库级锁,粒度很大,但是,它通过一些复杂特殊的处理(具体可以参见分析系列),尽量的提升了读写的并发度。
如果你还有担心,你可以看看这篇文章:/database/sqlite_cms.html。
SQL92:SQLite支持绝大部分的标准SQL语句,你只需要几百K的空间,就可以换来需要上百兆的通用DBMS几乎所有操作了。
方便(Convenience):如果你的程序要使用SQLite,只需要将拷贝你的程序目录即可。
开源(Opensource):这是它最强大的地方。
开源,意味着你可以品读它的源码,你可以随时修改它,加入你自己的特性,而这一切完全免费的。
开源,是一种精神。
实现部分好了,现在从实现的角度来谈谈个人体会,这也是我比较关注的。
SQLite是一款优秀的嵌入式数据库管理系统,这里有两层含义:一是它经常作为动态库嵌入到应用程序;另外一方面它通常用于嵌入式设备或其它要求较低的桌面应用。
如果把它作为内存数据库,个人觉得不是很适合。
毕竟,它的写并发性不是很好,此时,TimesTen也许会更好,Berkey DB也许是一个不错的选择。
SQLite这样的嵌入式数据库与主存数据库的应用场景、实现以及对资源的需求都是不一样的。
(1)事务处理事务的核心问题有两个:并发控制和恢复。
解决了并发控制和恢复问题的系统,就能允许它的用户假设程序是原子的(atomically)执行的——好像没有其它的程序同时执行;而且是可靠的(reliably)——不会产生失败。
原子性和可靠性的抽象,则称为事务(transaction)。
其实,事务并不是DBMS的专利,任何分布式系统,都面对并发和恢复问题,而解决的方法就是事务,只不过,我们更常听到DBMS中的事务。
并发控制保证事务的原子执行,它使得交错执行的事务看起来是一个接一个的顺序执行的,完全没有交错执行。
如果交错执行的结果与顺序执行的结果一致,则称为串行化(serializable)。
恢复使得数据库仅仅包含那些正常完成的事务的结果。
如果事务在执行的过程中发生错误,不能继续进行,恢复算法必须清除部分完成事务产生的影响。
并发控制SQLite只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也就是说,即事务T1在A表插入一条数据,事务T2在B表中插入一条数据,这两个操作不能同时进行,即使你的机器有100个CPU,也无法同时进行,而只能顺序进行。
表级都不能并行,更别说元组级了——这就是库级锁。
但是,SQLite尽量延迟申请X锁,直到数据块真正写盘时才申请X锁,这是非常巧妙而有效的。
恢复SQLite的恢复技术是影子分页技术(shadow paging)技术的典型代表。
DBMS的常用恢复技术有影子分页技术与基于日志的技术,前者在早其数据库管理系统中用到,比如System R,现代DBMS中已经很难见到它的身影了。
影子分页技术与基于日志技术相比,优点是实现简单,消除了写日志记录的开销,恢复的速度也快(不需要redo和undo)。
影子分页的缺点就是事务提交时要输出多个块,这使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况——这是它致命的缺点。
(2)查询处理SQLite的查询处理本质上就是一个SQL编译器和一个虚拟机。
而实现这些功能只用了十多个文件,整个实现实现简单而有效,但是也存在一些问题。
首先,SQLite字典数据很简单,实际上它的字典就一个表sqlite_mater,所有的信息都是通过对sqlite_master 中SQL语句进行解析获取的,而解析一个SQL语句,都需要进行词法分析、语法分析、甚至虚拟机代码的生成。
而这一过程是很需要时间的,而且,查询计划也没有重用。
其次,查询优化还比较简单,特别是连接操作,只通过循环来做(MySQL也一样)。
但是,仅仅数万代码,我们不能对它要求太苛求。
(3)存储模型SQLite的文件物理上被划分成相同大小的块;逻辑上划分成一些B-Tree——每个表对应一个B-Tree。
而没有像Oracle,或者InnoDB对数据块进行复杂的逻辑组织,这种按需分配数据块的做法必然影响磁盘的读写性能。
不过,归根到底,还是源于它的应用场景。
(4)缓冲区管理Buffer的管理对于DBMS,无疑是非常重要的,SQLite在其它方面做得比较简单,但是在缓冲区管理这一块,它还是做足了功夫。
SQLite采用DBMS常用的LRU算法。
更值得一提的是,在较新的版本中,SQLite采用和虚拟文件系统的类似的方式,实现了让默认缓冲区管理子系统可以很容易的切换成其它的缓冲区管理算法,这是非常灵活的。
(5)I/OSQLite采用简单的阻塞I/O,较新的版本将异步I/O作为可选的扩展,但是,由于SQLite没有日志,所以,事务中ACID中的D,就无法保证,所以,如果你的数据很关键,请不要用SQLite的异步I/O。
另一方面,实际上,很多嵌入式操作系统,比如Windows CE 并不支持异步I/O(不过,这可以通过多线程加以解决)。
但是,这些“缺点”并不是SQLite的缺点,相对于通过DBMS,恰恰是它的优点,这样的实现简单,而且对资源的需求较低。
对嵌入式设备、或者那些要求较低的应用,已经足够,足够就好。
应用场景嵌入式设备:这应该是SQLite应用的主要场景,很多公司都在他们的嵌入式应用程序中使用SQLite,其中不乏google的Android。
桌面应用:如果你已经厌恶了fopen,fread,fwrite这些函数,SQLite是你不错的选择,它接口简单,而且支持事务。
前些天无意中下了一个cookie清除软件——CookieCrumbler,打开一看,发现里面竟然有一个sqlite3.dll,着实让我震惊了一把。
Websites:如果你的站点的访问量、数据量小的个人站点,SQLite可以代替开销较大的MySQL和繁杂的Access。
最近因为学校那个项目,也在搞数据库方面的东西,以前也用过SQLITE的东西,拿来复习下Sqlite是一个面向嵌入式系统的数据库,编译完成只有200K,同时支持2T 的数据记录。
对于嵌入式设备是一个很好的数据库引擎。
本文通过一个小例子说明如何在C与C++调用Sqlite API完成数据库的创建、插入数据与查询数据。
本文的开发环境为(Redhat9.0 + Qtopia2.1.2 + Sqlite3) 安装Sqlite3:从上下载Sqlite3.2.2运源代码,依照Readme中的步骤: tar xzf sqlite3.2.2.tar.gzmkdir bldcd bld../sqlite3.2.2/configuremakemake install然后在shell下运行 sqlite3 test.db命令可以检验是否已经安装成功。
创建数据库:sqlite3 *pDB = NULL;char * errMsg = NULL;//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件int rc = sqlite3_open(databaseName, &pDB);if(rc){cout << " Open the database " << databaseName << " failed" << endl; }//如果创建成功,添加表else{cout << "create the database successful!" << endl;//creat the tableint i;for(i=1; i<nTableNum; i++){}//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串//第三个参数为callback函数,这里没有用,第四个参数为callback 函数//中的第一个参数,第五个为出错信息rc = sqlite3_exec(pDB, "CREATE TABLE chn_to_eng(chinese QString, english QString)", 0, 0, &errMsg);if(rc == SQLITE_OK)cout << "create the chn_to_eng table successful!" << endl; elsecout << errMsg << endl;//同上,插入另一个表rc = sqlite3_exec(pDB, "CREATE TABLE eng_to_chn(english QString, chinese QString)", 0, 0, &errMsg);if(rc == SQLITE_OK)cout << "create the eng_to_chn table successful!" << endl; elsecout << errMsg << endl;}、、、、、、//往表中添加数据char chn[]="...";char eng[]="...";char value[500];//定义一条参数SQL命令,其中chn,eng为需要插入的数据sprintf(value, "INSERT INTO chn_to_eng(chinese, english) VALUES('%s', '%s')", chn, eng);//use the SQLITE C/C++ API to create and adjust a database.rc = sqlite3_exec(pDB,value,0, 0, &errMsg);//查询一条记录char value[500];//定义一条查询语句,其中条件为当english为target时的中文记录//print_result_cb为callback函数,在其中可以得到查询的结果,具体见下文sprintf(value, "SELECT chinese FROM eng_to_chn where english='%s' ", target);rc = sqlite3_exec(pDB,value,print_result_cb, 0, &errMsg);if(rc == SQLITE_OK){// #ifdef_debugcout << "select the record successful!" << endl;// #endif}else{// #ifdef_debugcout << errMsg << endl;// #endifreturn false;}.......}//callback回调函数print_result_cb的编写,其中data为sqlite3_exec 中的第四个参数,第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值得。