Android 数据库开发(一)SQLite3概述

前言

SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目,设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在Android、iOS等移动操作系统中的数据库实现也是使用的SQLite3。对于Android开发者来说数据库并不算很好维护,所以深入了解SQLite数据库也变得很有必要,本文就来先介绍下SQLite3。

1.SQLite3简单介绍

SQLite并不是一个独立的进程,而是作为程序的一部分,应用程序经由编程语言内的API直接调用SQLite,这能有效的减少数据库访问的延迟,因为在一个进程中调用函数要比跨进程通信更有效率。SQLite将整个数据库作为一个单独的、可跨平台的文件存储再主机中,它采用了再写入数据时将整个数据库文件加锁的简单的设计,尽管写操作只能串行进行,但SQLite的读操作可以多任务同时进行。 程序库实现了多数的SQL-92标准,包括事务以及实现原子性、一致性、隔离性和持久性,但它缺失了某些特性,例如它仅部分支持触发器: 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。尽管它支持大多数复杂查询,但它的ALTER TABLE 功能有所限制:只能添加和重命名列,不能修改或者删除列。因此,当需要修改或者删除列名时只能重新创建表。

2. 为什么要用 SQLite

  • 不需要一个单独的服务器进程或操作的系统(无服务器的);
  • 不需要配置,这意味着不需要安装或管理;
  • 非常小,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB;
  • 自给自足的,这意味着不需要任何外部的依赖;
  • 支持 SQL92(SQL2)标准的大多数查询语言的功能。 SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API;
  • 支持数据库大小至2TB;
  • 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。

3. SQLite的系统架构

  SQLite采用了模块的设计,它由三个子系统,包括8个独立的模块构成;模块将复杂的查询过程分解为细小的工作进行处理。

如上图所示,sqlite主要由7个构件子系统(也就是模块)组成,这些模块被分割为两个部分: 前端解析系统和后端引擎。

前端解析系统

前端预处理应用程序传递过来的SQL语句和SQLite命令,对获取的编码分析,优化,并转换 为后端能够执行的SQLite内部字节编码。前端可分为三个模块:

  • 标示分析(Tokenizer) 将输入的SQL语句分成标识符;
  • 语法分析(Parser) 解析器分析通过标识器产生的标识分析语句的结构,并且得到一颗语法树。解析器同时也包含了重构语法树的优化器,因此能够找到一颗产生一个高效的字节编码程序的语法树。
  • 代码生成器(Code Generator) 代码生成器遍历语法树,并且生成一个等价的字节编码程序。

后端引擎

后端是用来解释字节编码程序的引擎,该引擎做的才是真正的数据库处理工作。后端部分由四个模块组成:

  • 虚拟机(VM) VM模块是一个内部字节编码语言的解释器。它通过执行字节编码语句来实现SQL语句的工作。它是数据库中数据的最终的操作者。它把数据库看成表和索引的集合,而表和索引则是一系列的元组或者记录。
  • B/B+树 B/B+树模块把每一个元组集组织进一个一次排好序的树状数据结构中,表和索引被分别置于单独的B+和B树中。该模块帮助VM进行搜索,插入和删除树中的元组。它也帮助VM创建新的树和删除旧的树
  • 页面调度程序(pager) 页面调度程序模块在原始文件的上层实现了一个面向页面的数据库文件抽象。它管理B/B+树使用的内存内缓存(数据库页的),另外,他也管理文件的锁定,并用日志来实现事物的ACID属性。
  • 操作系统交界面(system interface) 操作系统界面模块提供了对应于不同本地操作系统的统一交界面。

本文分享自微信公众号 - 刘望舒(liuwangshuAndroid)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

MySQL 存储过程的简单使用

首先创建一张 students 表 SQL脚本如下: create table students( id int primary key auto_in...

29940
来自专栏信安之路

利用DNS协议回显数据

这个问题已经是去年提出的了,之前也看到过,在 CTF 题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。

20500
来自专栏liuchengxu

在 Golang 开发中使用 Makefile

使用 Golang 已经有一阵了,在 Golang 的开发过程中,我已经习惯于不断重复地手动执行 go build 和 go test 这两个命令. 不过,现...

29410
来自专栏idba

死锁案例之十

死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋...

11520
来自专栏沃趣科技

初相识 | 全方位认识 sys 系统库

前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库。在我们的发布计划中为什么要把p...

25930
来自专栏杨建荣的学习笔记

海量数据迁移之传输表空间(一) (r5笔记第71天)

在自己接触的很多的数据迁移工作中,使用外部表在一定程度上达到了系统的预期,对于增量,批量的数据迁移效果还是不错的,但是也不能停步不前,在很多限定的场景中,有很多...

25370
来自专栏信安之路

轻松理解什么是 SQL 注入

作为长期占据 OWASP Top 10 首位的注入,OWASP 对于注入的解释如下:

14300
来自专栏杨建荣的学习笔记

MySQL删除数据的简单尝试 (r7笔记第98天)

在Oracle里面对于数据清理,如果是非分区表,目前我经常的处理思路是下面三个。 第一种是中规中矩,做好备份,然后开始清理,当然这种情况只是说明数据清理的部分,...

32450
来自专栏极客慕白的成长之路

数据库系统概述必背知识点整理

16520
来自专栏IT技术精选文摘

如何加快MySQL模糊匹配查询

19950

扫码关注云+社区

领取腾讯云代金券