SQLite开发入门手册Word格式文档下载.docx
- 文档编号:18731814
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:39
- 大小:1.71MB
SQLite开发入门手册Word格式文档下载.docx
《SQLite开发入门手册Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SQLite开发入门手册Word格式文档下载.docx(39页珍藏版)》请在冰豆网上搜索。
Sqlite的锁机制20
事务20
SQLite中的锁20
保留状态(reserved)22
待定状态(pending)23
独占状态(exclusive)23
Sqlite实例代码24
1.常规数据插入24
2.高效的批量数据插入:
26
3.数据查询30
SQLiteC/C++接口简介34
1.0CoreObjectsAndInterfaces34
1.1TypicalUsageOfCoreRoutinesAndObjects37
2.0ConvenienceWrappersAroundCoreRoutines38
3.0BindingParametersandReusingPreparedStatements38
4.0ExtendingSQLite39
5.0OtherInterfaces40
Sqlite的其他信息41
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,即统计数据的预计算。
比如我们正在运行数据实时采集的服务程序,我们可能需要将每10秒的数据汇总后,形成每小时的统计数据,该统计数据可以极大的减少用户查询时的数据量,从而大幅提高前端程序的查询效率。
在这种应用中,我们可以将1小时内的采集数据均缓存在SQLite中,在达到整点时,计算缓存数据后清空该数据。
4.数据分析:
可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。
这一点是CSV文件无法比拟的。
5.产品Demo和测试:
在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相比,使用SQLite减少了大量的系统部署时间。
对于产品的功能性测试而言,SQLite也可以起到相同的作用。
三、和RDBMS相比SQLite的一些劣势:
1.C/S应用:
如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网络传输来完成的。
在这种情况下,不应该选择SQLite。
由于SQLite的数据管理机制更多的依赖于OS的文件系统,因此在这种操作下其效率较低。
2.数据量较大:
受限于操作系统的文件系统,在处理大数据量时,其效率较低。
对于超大数据量的存储,甚至不能提供支持。
3.高并发:
由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。
换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。
在这种同步机制下,并发性能很难高效。
四、个性化特征:
1.零配置:
SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。
当然也不存在服务器实例的启动和停止。
在使用的过程中,也无需创建用户和划分权限。
在系统出现灾难时,如电源问题、主机问题等,对于SQLite而言,不需要做任何操作。
2.没有独立的服务器:
和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。
SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。
然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。
但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工作。
3.单一磁盘文件:
SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。
其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。
尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。
这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。
4.平台无关性:
这一点在前面已经解释过了。
和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。
这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。
然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。
数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。
因此和直接拷贝数据库文件相比,其性能是非常拙劣的。
5.弱类型:
和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。
因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'
hello'
。
针对该特征唯一的例外是整型的主键列,对于此种情况,我们只能在该列中存储整型数据。
6.SQL语句编译成虚拟机代码:
很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。
相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。
该方式提供了更好的性能和更出色的调试能力。
Sqlite环境配置
虽然说摆弄c/c++有很长时间了,但是说到用c/c++来摆弄数据库倒还真是没有弄过,一直有关数据库的项目似乎都用.Net给去OK了,就好比SQLite,现在的项目就是用的SQLite.Net,有什么东西都是用c#直接操作SQLite.Net了,而相对底层的东西则使用c/c++完成且封装成DLL供c#调用就OK了。
不过有的时候自己在写一些小东西的时候,可能也会有些数据需要本地存储的,
以前为了图个简单,就直接存文件咯,不过要是相对隐私点的东西的话,
我想还是有个数据库比较好,这不是就有SQLite3了嘛,注意一下哈,
SQLite3是供c/c++代码来使用的,如果是.Net的话那就得用SQLite.Net了,废话少说,进入正题了,首先我们需要下载好SQLite3的相关文件,
官网地址:
http:
//www.sqlite.org/download.html
我们先下载的是SQLite3的源码,下载好后,你可以解压缩出来,然后你就会看到4个C/C++文件了。
而我们每次在C/C++中使用SQLite3时总是需要其中的头文件sqlite3.h
然后需要下载的是SQLite3的DLL文件以及导出库,下载完后你可以解压出来,你会发现只有SQLite3.dll和SQLite3.def两个文件,
做过c/c++DLL的都知道,.def文件可以用来定义一个DLL中API的导出,所以我们可以打开SQLite3.def看看,里面定义的API名称就是SQLite3.dll所导出的API,而在C/C++中如果你要链接到其他的DLL上,你必须要有那个DLL的导出库,也就是.lib文件,而我们这里没有导出文件(Lib)怎么办呢?
没有那就根据DLL和.def文件来生成一个.lib文件不就OK了。
首先将SQLite3.dll和SQLite3.def文件拷贝到VS安装目录下的Bin文件夹,比如我安装的是VS2010,且默认安装在C:
\ProgramFiles\目录下面,那么你就需要将上面的两个文件拷贝到以下目录:
C:
\ProgramFiles\MicrosoftVisualStudio10.0\VC\bin
然后打开VisualStudio命令提示符,且定位到上面的这个目录,
然后输入命令:
lib/def:
sqlite3.def/machine:
ix86,
然后你就会在Bin目录下发现已经生成了SQLite3.lib文件。
关于这SQLite3的Shell文件呢,就是用来创建SQLite3数据库啊,创建表啊之类的东西,说白了就是个SQLiteAdmin的控制台界面,当然咯,控制台这个东西并不怎么好用,所以你可以考虑换个其他的带GUI的工具来管理你的SQLite3数据库。
有个工具不错,叫DataBase.Net,什么乱七八糟的数据库它都可以连接上去,不过要.NetFramework的支持。
对于这个SQLite3的Shell文件你可以直接在SQLite的官方网站上下载到,
而后,除了下载SQLite3的Shell工具外,我们还可以自己编译SQLite源代码来生成这个工具,前面我们已经下载好了SQLite3的源代码,并且源代码里面还有一个叫做shell.c的文件,
其实这个文件就可以用来处理SQLite3Shell命令的,
所以我们可以直接在VS2010下新建一个Console项目,
然后将源代码里面的4个C\C++文件拷贝到项目中,然后直接编译,
你也可以得到SQLite3的Shell工具SQLite3.exe。
这里使用麻烦点的方式,即使用SQLite3的Shell工具,
下面的例子呢就是很简单的方式,即使用SQLite3的Shell工具来创建个DataBase,
然后再创建个Table,再插入几条记录,查询一下就OK了。
具体命令就看下面的截图就好了:
首先在命令行下定位到你的SQLite3.exe也就是Shell程序所在的目录:
比如我的SQLite3.exe所在目录为:
E:
\Code\SQLite\sqlite-shell-win32-x86-3071000
然后输入命令sqlite3testDB.db从而创建SQLite数据库,
然后输入命令createtabletestDB_ID(IDint,Numberint)来创建数据表testDB_ID
然后输入命令;
从而执行上面的创建表的命令。
执行完这些命令后,在你的Shell程序也就是SQLite3.exe所在的位置中发现你创建的testDB.db数据库了。
其实上面的这种创建数据库的方式太麻烦了,还不如直接用Database.Net来做,方便很多,
比如我用DataBase.Net打开我们上面创建的这个testDB.db数据库,用这个工具来管理数据库很方便。
6.mspdb80.dll无法找到
在cmd中键入cl执行编译时会出现mspdb80.dll无法找到的情况,是因为VC\Bin\下没有“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件,解决的方法:
1>
直接从Common7\IDE\下复制这四个文件到VC\Bin\下即可解决
2>
添加系统变量(Path),这样:
我的电脑->
属性->
高级->
环境变量->
系统变量,在path中添加C:
\ProgramFiles\MicrosoftVisualStudio8\Common7\IDE;
,注意结尾最后用“;
”隔开!
这样在用cl编译就不会出现mspdb80.dll文件找不到的错误了。
Sqlite操作入门
该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。
但是对于一些SQLite特有的规则,我们会给予额外的说明。
注:
以下所有示例均是在sqlite自带命令行工具中完成的。
1).最简单的数据表:
sqlite>
CREATETABLE
testtable(first_colinteger);
这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。
2).创建带有缺省值的数据表:
testtable(first_colinteger
DEFAULT
0,second_colvarchar
'
);
3).在指定数据库创建表:
ATTACHDATABASE
d:
/mydb.db'
AS
mydb;
mydb.testtable(first_colinteger);
这里先通过ATTACHDATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。
关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。
如果需要创建临时表,就无需指定数据库名,见如下示例:
--创建两个表,一个临时表和普通表。
CREATETEMPTABLE
temptable(first_colinteger);
--将当前连接中的缓存数据导出到本地文件,同时退出当前连接。
.backup
/mydb.db
.exit
--重新建立sqlite的连接,并将刚刚导出的数据库作为主库重新导入。
.restore
--查看该数据库中的表信息,通过结果可以看出临时表并没有被持久化到数据库文件中。
.tables
testtable
4)."
IFNOTEXISTS"
从句:
如果当前创建的数据表名已经存在,即与已经存在的表名、视图名和索引名冲突,那么本次创建操作将失败并报错。
然而如果在创建表时加上"
从句,那么本次创建操作将不会有任何影响,即不会有错误抛出,除非当前的表名和某一索引名冲突。
Error:
tabletesttablealreadyexists
CREATETABLEIFNOTEXISTS
5).CREATETABLE...ASSELECT:
通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。
然而新创建的表将会包含结果集返回的所有数据。
testtable2
ASSELECT
*
FROM
testtable;
.schema
testtable2
CREATETABLEtesttable2(first_colINT);
.schema命令是sqlite3命令行工具的内置命令,用于显示当前数据表的CREATETABLE语句。
6).主键约束:
--直接在字段的定义上指定主键。
PRIMARYKEYASC);
--在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和second_col的联合主键。
testtable2(
...>
first_colinteger,
second_colinteger,
PRIMARYKEY
(first_col,second_col)
);
和其他关系型数据库一样,主键必须是唯一的。
7).唯一性约束:
--直接在字段的定义上指定唯一性约束。
UNIQUE);
--在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。
first_colinteger,
second_colinteger,
UNIQUE
在SQLite中,NULL值被视为和其他任何值都是不同的,这样包括和其他的NULL值,如下例:
DELETEFROMtesttable;
SELECTcount(*)FROMtesttable;
count(*)
----------
INSERTINTOtesttableVALUES(N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQLite 开发 入门 手册