sqlite3使用范围

SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化: 1.易于管理 2.易于使用 3.易于嵌入其他大型程序 4.易于维护和配置 

许多人喜欢SQLite因为它的小巧和快速. 但是这些特性只是它的部分优点, 使用者还会发现SQLite是非常稳定的. 出色的稳定性源于它的简单, 越简单就越不容易出错. 除了上述的简单、小巧和稳定性外, 最重要的在于SQLite力争做到简单化.

简单化在一个数据库引擎中可以说是一个优点, 但也可能是个缺点, 主要决定于你想要做什么. 为了达到简单化, SQLite省略了一些人们认为比较有用的特性, 例如高并发性、严格的存取控制、丰富的内置功能、存储过程、复杂的SQL语言特性、 XML以及Java的扩展, 超大的万亿级别的数据测量等等. 如果你需要使用上述的这些特性并且不介意它们的复杂性, 那么SQLite也许就不适合你了. SQLite没有打算作为一个企业级的数据库引擎, 也并不打算和Oracle或者PostgreSQL竞争.

仅凭经验来说SQLite适用于以下场合: 当你更看中简单的管理、使用和维护数据库, 而不是那些企业级数据库提供的不计其数的复杂功能的时候,使用SQLite是一个比较明智的选择. 事实也证明, 人们在许多情况下已经清楚的认识到简单就是最好的选择.

SQLite最佳试用场合

  1. 网站:作为数据库引擎SQLite适用于中小规模流量的网站(也就是说, 99.9%的网站). SQLite可以处理多少网站流量在于网站的数据库有多大的压力. 通常来说, 如果一个网站的点击率少于100000次/天的话, SQLite是可以正常运行的. 100000次/天是一个保守的估计, 不是一个准确的上限. 事实证明, 即使是10倍的上述流量的情况下SQLite依然可以正常运行.
  2. 嵌入式设备和应用软件:因为SQLite数据库几乎不需要管理, 因此对于那些无人值守运行或无人工技术支持的设备或服务, SQLite是一个很好的选择. SQLite能很好的适用于手机, PDA, 机顶盒, 以及其他仪器. 作为一个嵌入式数据库它也能够很好的应用于客户端程序.
  3. 应用程序文件格式:SQLite作为桌面应用程序的本地磁盘文件格式取得了巨大成功.例如金融分析工具、CAD 包、档案管理程序等等. 一般的数据库打开操作需要调用sqlite3_open()函数,并且标记一个显式本地事务的起始点(BEGIN TRANSACTION)来保证以独占的方式得到文件的内容. 文件保存将执行一个提交(COMMIT)同时标记另一个显式本地事务起始点. 这种事务处理的作用就是保证对于应用程序数据文件的更新是原子的、持久的、独立的和一致的. 数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中. 当用户按下取消/重做按钮的时候这些改变将可以被回滚. 应用这项技术实现一个无限级的取消/重做功能只需要编写很少的代码.
  4. 替代某些特别的文件格式:许多程序使用fopen(), fread(), 或 fwrite()函数创建和管理一些自定义的文件用来保存数据. 使用SQLite替代这些自定义的文件格式将是一种很好的选择.
  5. 内部的或临时的数据库:对于那些有大量的数据需要用不同的方式筛选分类的程序, 相对于编写同样功能的代码, 如果你把数据读入一个内存中的SQLite数据库, 然后使用连接查询和ORDER BY子句按一定的顺序和排列提取需要的数据, 通常会更简单和快速. 按照上述的方法使用内嵌的SQLite数据库将会使程序更富有灵活性, 因为添加新的列或索引不用重写任何查询语句.
  6. 命令行数据集分析工具:有经验的SQL用户可以使用SQLite命令行程序去分析各种混杂的数据集. 原是数据可以从CSV(逗号分隔值文件)文件中导入, 然后被切分产生无数的综合数据报告. 可能得用法包括网站日志分析, 运动统计分析, 编辑规划标准, 分析试验结果. 当然你也可以用企业级的客户端/服务器数据库来做同样的事情. 在这种情况下使用SQLite的好处是: SQLite的部署更为简单并且结果数据库是一个单独的文件, 你可以把它存储在软盘或者优盘或者直接通过email发给同事.
  7. 在Demo或测试版的时候作为企业级数据库的替代品:如果你正在编写一个使用企业级数据库引擎的客户端程序, 使用一个允许你连接不同SQL数据库引擎的通用型数据库后台将是很有意义的. 其更大的意义在于将SQLite数据库引擎静态的连接到客户端程序当中,从而内嵌SQLite作为混合的数据库支持. 这样客户端程序就可以使用SQLite数据库文件做独立的测试或者验证.
  8. 数据库教学:因为SQLite的安装和使用非常的简单(安装过程几乎忽略不计, 只需要拷贝SQLite源代码或sqlite.exe可执行文件到目标主机, 然后直接运行就可以) 所以它非常适合用来讲解SQL语句. 同学们可以非常简单的创建他们喜欢的数据库, 然后通过电子邮件发给老师批注或打分. 对于那些感兴趣怎样实现一个关系型数据库管理系统(RDBMS)的高层次的学生, 按照模块化设计且拥有很好的注释和文档的SQLite源代码, 将为他们打下良好的基础. 这并不是说SQLite就是如何实现其他数据库引擎的精确模型, 但是很适合学生们了解SQLite是如何快速工作的, 从而掌握其他数据库系统的设计实现原则.
  9. 试验SQL语言的扩展:SQLite简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台.

sqlite3基础

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

目标:易于管理、操作、维护、自定义以及提供易用的编程接口

SQLite有以下特性(优点)

  • 零配置一无需安装和管理配置;
  • 储存在单一磁盘文件中的一个完整的数据库;
  • 数据库文件可以在不同字节顺序的机器间自由共享;
  • 支持最大 2tb 的单个库文件;
  • 足够小,全部源码大致3万行c代码,250KB;
  • 比目前流行的大多数数据库对数据的操作要快;比MySQL(2倍), PostgreSQL(20倍)快
  • 允许为SQL命令集动态添加自定义函数(简单函数及聚集函数),而无需重编SQLite库
  • ACID兼容(原子性,一致性,独立性,可持久性,Atomicity、Consistency、Isolation、Durability ),支持视图,子查询,触发器

SQLite的缺点

  • 事务处理并发性:SQLite通过数据库级上的独占性和共享锁来实现独立事务处理,这意味着当多个进程或线程在同一时间可以从数据库读取数据,但是只能有一个可以同时写入,在写入之前,必须获得独占锁,其它的读操作不允许发生。
  • 性能:在创建索引( CREATE INDEX)和删除表( DELTE TABLE)时明显比其它数据库慢
  • 用户管理/安全:数据库的访问是基于操作系统对文件的控制来控制的,不能通过用户来区分数据库中的不同数据库。举例,将数据库文件去写权限,然后向其中插入或删除数据条目,将提示写失败。但是不能通过数据库本身的来对权限进行设置。

SQLite的内部结构

在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。所有 SQL 语句都被编译成易读的、可以在 SQLite 虚拟机中执行的程序集。

1.接口将SQL语句传给SQL编译器

2.SQL编译器选将SQL分解成为Token

3.将Token传递给解析器进行解析

4.由代码生成器生成虚拟机代码

5.由虚拟机执行生成的程序

6.SQLite库在磁盘上以B树形式组织(每个表和索引都有自己单独的B树,所有的B树都保存的同一个文件里面)

7.OS层的操作

制作一个静态的sqlite3.lib文件

制作一个叫静态的sqlite3.lib文件  ;生成的sqlite3.lib静态库文件有2M多,使用时每次编译都很慢,最后生成的exe文件也很大,不过单独运行exe文件就行了,不需要(sqlite3.lib,sqlite3.dll)。

生成动态的sqlite3.lib,与sqlite3.dll一起使用

使用VC将sqlite3.def转化为sqlite3.lib ,此生成的动态的sqlite3.lib文件只有40多k。 所使用工程编译会比较快,编译时,sqlite.lib文件要放在工程目录中;运行时,sqlite.dll文件要放在与exe文件同一个目录中,且此目录不需要sqlite.lib文件。

由源码来制作sqlite.dll文件

1.新建工程sqlite3,WIN32项目-->DLL(D),空项目-->完成。
2.把sqlite-amalgamation-3071700.zip中的sqlite3.c,sqlite3.h,sqlite3ext.h和sqlite-dll-win32-x86-3071700.zip中的sqlite3.def放到工程中,并把他们添加到解决方案中,
3.项目属性-->连接器,输入-->模块定义文件:sqlite.def;编译,会出现如下
  1. 错误  8   error LNK2001: 无法解析的外部符号 sqlite3_table_column_metadata  E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  2. 错误  7   error LNK2001: 无法解析的外部符号 sqlite3_column_table_name16    E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  3. 错误  6   error LNK2001: 无法解析的外部符号 sqlite3_column_table_name  E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  4. 错误  5   error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name16   E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  5. 错误  4   error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  6. 错误  3   error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16 E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
  7. 错误  2   error LNK2001: 无法解析的外部符号 sqlite3_column_database_name   E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def   1   sqlite3
     错误	8	error LNK2001: 无法解析的外部符号 sqlite3_table_column_metadata	E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def	1	sqlite3
错误 7 error LNK2001: 无法解析的外部符号 sqlite3_column_table_name16 E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3
错误 6 error LNK2001: 无法解析的外部符号 sqlite3_column_table_name E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3
错误 5 error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name16 E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3
错误 4 error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3
错误 3 error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16 E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3
错误 2 error LNK2001: 无法解析的外部符号 sqlite3_column_database_name E:\workPlace\VS2010Project\MFCDLL\sqlite3\sqlite3.def 1 sqlite3

4.解决办法,在sqlite.c文件中,顶部添加

  1. #ifndef SQLITE_ENABLE_COLUMN_METADATA
  2. # define SQLITE_ENABLE_COLUMN_METADATA
  3. #endif
#ifndef SQLITE_ENABLE_COLUMN_METADATA
# define SQLITE_ENABLE_COLUMN_METADATA
#endif

然后,在编译,会生成sqlite.lib(48k)和sqlite.dll(debug版本780多k,release版本,500多k),使用DLL Export Viewer工具打开sqlite3.dll文件会看到有207个函数。

5.加密
SQLite的作者早就考虑到以后数据加密的需求,所以预留了加密接口,我们只需要完成这些接口,就可以让它保存的数据变成密文。在说怎么加入加密功能之前,先简单说一下SQLite的文件。它非常简单和紧凑,只有 sqlite3.h 和 sqlite3.c 两个文件,.h文件定义了一些宏和全部接口,.c文件就是接口实现,我们主要修改.c文件的实现。原文即加密源代码 
     VC++下的sqlite数据库加密
要打开加密功能,需要定义一个宏。并在sqlite.def中添加一个导出函数:sqlite3_key.
  1. #ifndef SQLITE_HAS_CODEC
  2. # define SQLITE_HAS_CODEC
  3. #endif
#ifndef SQLITE_HAS_CODEC
# define SQLITE_HAS_CODEC
#endif

定义该宏之后,重新编译代码,发现现在编译不通过了,提示有5个函数并没有实现,它们分别是: --------这些实现可以在网上找到。

  1. int sqlite3CodecAttach(sqlite3 * db,  int nDB, const void * pKey, int nKeyLen)
  2. void sqlite3CodecGetKey(sqlite3 * db, int nDB, void ** Key, int * nKey)
  3. int sqlite3_key(sqlite3 * db, const void * pKey, int nKey)
  4. int sqlite3_rekey(sqlite3 * db, const void * pKey, int nKey)
  5. void sqlite3_activate_see(const char * right)
int sqlite3CodecAttach(sqlite3 * db,  int nDB, const void * pKey, int nKeyLen)
void sqlite3CodecGetKey(sqlite3 * db, int nDB, void ** Key, int * nKey)
int sqlite3_key(sqlite3 * db, const void * pKey, int nKey)
int sqlite3_rekey(sqlite3 * db, const void * pKey, int nKey)
void sqlite3_activate_see(const char * right)

对sqlite3 API进一步封装

SQLite语法备忘录

sqlite3编程使用简介的更多相关文章

  1. Windows数据库编程接口简介

    数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法 ...

  2. 《Node.js 高级编程》简介与第二章笔记

    <Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...

  3. Spring中的面向切面编程(AOP)简介

    一.什么是AOP AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面 ...

  4. MapReduce编程模型简介和总结

    MapReduce应用广泛的原因之一就是其易用性,提供了一个高度抽象化而变得非常简单的编程模型,它是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,在其编程模型中,任务可以被分解成相互独立的 ...

  5. Linux下sqlite3编程

    ---------------------------------------------------------------------------------------------------- ...

  6. GDI 编程基础简介

    今天准备重新对GDI的知识进行回顾一下,以便加深认识. 一.GDI 在进行Windows编程时,可能经常会用到设备描述表的类型句柄,例如,最厂家的HDC,它就是图像设备描述类型句柄.因为GDI的绘图函 ...

  7. C#Socket编程(一)简介

    一.TCP与UDP简介 https://blog.csdn.net/subin_iecas/article/details/80289513 二.单播.多播.广播 https://blog.csdn. ...

  8. shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)

    如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...

  9. SHELL编程入门简介

    一.SHELL软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...

随机推荐

  1. 单例模式简单解析--Singleton 单例模式(懒汉方式和饿汉方式)

    单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例       这是最基本 ...

  2. Linux下进程的建立

    Linux下进程的建立 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程来创建另外一个进程.这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使 ...

  3. Ubuntu 14.10 下grep命令详解

    简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...

  4. matlab的正则表达式讲解[转]

    引言.啥是正则表达式?正则表达式是干啥的?我理解就和我们在word或者其他编辑软件里点的查找.替换的作用是差不多的,不过功能要强大的多,当然使用起来也稍微复杂一些.书上的定义差不多是这样的:正则表达式 ...

  5. leetcode 238 Product of Array Except Self

    这题看似简单,不过两个要求很有意思: 1.不准用除法:最开始我想到的做法是全部乘起来,一项项除,可是中间要是有个0,这做法死得很惨. 2.空间复杂度O(1):题目说明了返回的那个数组不算进复杂度分析里 ...

  6. Repeater分页

    void BindData()        {            PagedDataSource pds = new PagedDataSource();                     ...

  7. Tiling Up Blocks_DP

    Description Michael The Kid receives an interesting game set from his grandparent as his birthday gi ...

  8. Smart20学习记录----异步通知

    异步通知: 阻塞与非阻塞访问.poll()函数提供了较好地解决设备访问的机制(应用程序主动访问) 异步通知:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件 ...

  9. 表视图控制器(TableViewController)(一)

    1 创建一个UITableViewController并展示简单数据 1.1 问题 有很多移动客户端的应用都是采用表的形式来展示数据,因为表视图能使数据看起来更规整.更有调理,比如微信界面就是使用的表 ...

  10. <td colspan="2" > 一个td占两个 td空间

    <tr> <td>机构名称: ${accreditInfo.companyName}</td> <td>初始授信额度: ${accreditInfo.i ...