阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680

SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作为 PHP V4.3 中的一个选项引入的,构建在 PHP V5 中。SQLite 支持多数 SQL92 标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。SQLite 还非常健壮。其创建者保守地估计 SQLite 可以处理每天负担多达 100,00 次点击率的 Web 站点,并且 SQLite 有时候可以处理 10 倍于上述数字的负载。

功能

SQLite 对 SQL92 标准的支持包括索引、限制、触发和查看。SQLite 不支持外键限制,但支持原子的、一致的、独立和持久 (ACID) 的事务(后面会提供有关 ACID 的更多信息)。
这意味着事务是原子的,因为它们要么完全执行,要么根本不执行。事务也是一致的,因为在不一致的状态中,该数据库从未被保留。事务还是独立的,所以,如果在同一时间在同一数据库上有两个执行操作的事务,那么这两个事务是互不干扰的。而且事务是持久性的,所以,该数据库能够在崩溃和断电时幸免于难,不会丢失数据或损坏。

SQLite 通过数据库级上的独占性和共享锁定来实现独立事务处理。这意味着当多个进程和线程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

SQLite 网站上记录了完整的 SQLite locking semantics

内部结构

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

图 1. SQLite 的内部结构

 
SQLite 的内部结构

SQLite 支持大小高达 2 TB 的数据库,每个数据库完全存储在单个磁盘文件中。这些磁盘文件可以在不同字节顺序的计算机之间移动。这些数据以 B+树(B+tree)数据结构的形式存储在磁盘上。SQLite 根据该文件系统获得其数据库权限。

数据类型

SQLite 不支持静态数据类型,而是使用列关系。这意味着它的数据类型不具有表列属性,而具有数据本身的属性。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成列类型。如果不能转换,则该值将作为其本身具有的类型存储。

SQLite 支持 NULLINTEGERREALTEXTBLOB 数据类型。

管理 SQLite

SQLite 附带一个可下载的 command-line interface for database administration。通过数据库名称可以调用此命令行程序,并且可以按照下面的方式创建新的数据库和表:

清单 1. 创建新的数据库和表

  1. C:\minblogg>sqlite3 c:\minblogg\www\db\alf.db
  2. SQLite version 3.2.1
  3. Enter ".help" for instructions
  4. sqlite> create table mytable(name varchar(40), age smallint);
  5. sqlite> insert into mytable values('Nils-Erik',23);
  6. sqlite> select * from mytable;
  7. Nils-Erik|23
  8. sqlite>

然后,可以再次打开该数据库,列出它的表和架构,并继续进行插入和删除值的操作。

清单 2. 列出表和架构

  1. C:\minblogg>sqlite3 c:\minblogg\www\db\alf.db
  2. SQLite version 3.2.1
  3. Enter ".help" for instructions
  4. sqlite> .tables
  5. mytable
  6. sqlite> select * from mytable;
  7. Nils-Erik|23
  8. sqlite> .schema
  9. CREATE TABLE mytable(name varchar(40), age smallint);
  10. sqlite>

SQLite 还附带命令行数据库分析器,该分析器允许您显示关于任何 SQLite 数据库当前状态的详细信息。

清单 3. SQLite 分析器

  1. C:\minblogg>sqlite3_analyzer www\db\alf.db
  2. Analyzing table mytable...
  3. Analyzing table sqlite_master...
  4. /** Disk-Space Utilization Report For www\db\alf.db
  5. *** As of 2005-Apr-24 18:56:40
  6. Page size in bytes.................... 1024
  7. Pages in the whole file (measured).... 2
  8. Pages in the whole file (calculated).. 2
  9. Pages that store data................. 2 100.0%
  10. Pages on the freelist (per header).... 0 0.0%
  11. Pages on the freelist (calculated).... 0 0.0%
  12. Pages of auto-vacuum overhead......... 0 0.0%
  13. Number of tables in the database...... 2
  14. Number of indices..................... 0
  15. Number of named indices............... 0
  16. Automatically generated indices....... 0
  17. Size of the file in bytes............. 2048
  18. Bytes of user payload stored.......... 13 0.63%
  19. *** Page counts for all tables with their indices ********************
  20. MYTABLE............................... 1 50.0%
  21. SQLITE_MASTER......................... 1 50.0%
  22. *** All tables *******************************************************
  23. Percentage of total database.......... 100.0%
  24. Number of entries..................... 2
  25. Bytes of storage consumed............. 2048
  26. Bytes of payload...................... 91 4.4%
  27. Average payload per entry............. 45.50
  28. Average unused bytes per entry........ 916.50
  29. Maximum payload per entry............. 78
  30. Entries that use overflow............. 0 0.0%
  31. Primary pages used.................... 2
  32. Overflow pages used................... 0
  33. Total pages used...................... 2
  34. Unused bytes on primary pages......... 1833 89.5%
  35. Unused bytes on overflow pages........ 0
  36. Unused bytes on all pages............. 1833 89.5%
  37. *** Table MYTABLE ****************************************************
  38. Percentage of total database.......... 50.0%
  39. Number of entries..................... 1
  40. Bytes of storage consumed............. 1024
  41. Bytes of payload...................... 13 1.3%
  42. Average payload per entry............. 13.00
  43. Average unused bytes per entry........ 999.00
  44. Maximum payload per entry............. 13
  45. Entries that use overflow............. 0 0.0%
  46. Primary pages used.................... 1
  47. Overflow pages used................... 0
  48. Total pages used...................... 1
  49. Unused bytes on primary pages......... 999 97.6%
  50. Unused bytes on overflow pages........ 0
  51. Unused bytes on all pages............. 999 97.6%

由于完全能够使用命令行界面来管理数据库,因此它可以为数据库管理员带来很大的方便。目前有许多优秀的基于 Web 的 SQLite 数据库管理系统。其中有一个是基于 PHP 的 SQLiteManager

图 2. 使用 SQLiteManager 管理数据库

 
SQLiteManager

备份

备份 SQLite 数据库有两种方法。如果数据库正在使用中,则应从命令行界面使用 .dump 命令。这样可以创建一个包含必要命令和数据的文件,从而重新创建数据库。.dump 命令也可以用于备份数据库表。

清单 4. .dump 命令

  1. sqlite> .dump
  2. BEGIN TRANSACTION;
  3. CREATE TABLE mytable(name varchar(40), age smallint);
  4. INSERT INTO "mytable" VALUES('Nils-Erik', 23);
  5. COMMIT;
  6. sqlite>

如果数据库没有处于使用状态,则可以直接将数据库文件复制到安全位置。

在 PHP V5 中使用 SQLite
一个好的做法是将 SQLite 数据库与 PHP 代码分开。完成此操作的一个简便方法是创建一个 www 目录。在此目录中,创建一个用于存放 SQLite 数据库的 db 目录、一个用于存放数据库和表创建脚本的 dbscripts 目录和一个用于存放数据库备份的 backups 目录。

清单 5. 使用 PHP V5 组织 SQLite 数据库

  1. 2004-12-06 15:43 DIR .
  2. 2004-12-06 15:43 DIR ..
  3. 2005-04-23 19:55 DIR db
  4. 2005-01-02 11:46 DIR dbscripts
  5. 2005-01-02 11:46 DIR backups

在 PHP V5 中创建 SQLite 数据库与在命令行界面中创建该数据库非常相似。如果该数据库不存在,则创建一个空数据库。

  1. $db = sqlite_open('../db/ac.db');

创建一个表也非常容易:

清单 6. 创建表

  1. $db = sqlite_open('../db/ac.db');
  2. sqlite_query($db, 'DROP TABLE post');
  3. sqlite_query($db, 'CREATE TABLE post (id INTEGER PRIMARY KEY,
  4. kategori VARCHAR(20) NOT NULL,
  5. titel VARCHAR(75) NOT NULL, referens VARCHAR(75), status VARCHAR(20) not null,
  6. date varchar(10)not null, synopsis VARCHAR(120), inlaegg varchar(8192))');

插入一条记录:

  1. $sqldb = sqlite_open("../db/ac.db");
  2. sqlite_query($sqldb, "INSERT INTO isvs VALUES ('$isvurl' , '$isvname', '$comment')");

并选择数据:

清单 7. 从 SQLite 数据库中选择数据

  1. $sqldb = sqlite_open("www/db/ac.db");
  2. $results = sqlite_query($sqldb, "SELECT * FROM isvs order by isvurl asc ");
  3. while (list($isvurl, $isvname) = sqlite_fetch_array($results)) {
  4. sqlite_close($sqldb);

使用 SQLite 和数据库抽象层
两个先进的开源数据库抽象层对 SQLite 提供支持:PEAR::DB,它们包含在 PHP V5 中,并且被认为是更轻量级的 ezSQL。通过预先使用 PHP 扩展和应用程序库 (PEAR) 或 ezSQL,可将 SQLite 用于应用程序的快速复原,在以后需要时,可以将其无缝转向更具工业性质的数据库。

清单 8. 使用 ezSQL 和 SQLite

  1. $users = $db->get_results("SELECT name, age FROM table1");
  2. foreach ( $users as $user )
  3. {
  4. echo $user->name;
  5. echo $user->age;
  6. }

SQLite 使用注意事项

在确定是否在应用程序中使用 SQLite 之前,应该考虑以下几种情况:

  • 目前没有可用于 SQLite 的网络服务器。从应用程序运行位于其他计算机上的 SQLite 的惟一方法是从网络共享运行。这样会导致一些问题,像 UNIX® 和 Windows® 网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。
  • SQLite 只提供数据库级的锁定。虽然有一些增加并发的技巧,但是,如果应用程序需要的是表级别或行级别的锁定,那么 DBMS 能够更好地满足您的需求。
  • 正如前面提到的,SQLite 可以支持每天大约 100,00 次点击率的 Web 站点 —— 并且,在某些情况下,可以处理 10 倍于此的通信量。对于具有高通信量或需要支持庞大浏览人数的 Web 站点来说,应该考虑使用 DBMS。
  • SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。
  • SQLite 支持多数(但不是全部)的 SQL92 标准。不受支持的一些功能包括完全触发器支持和可写视图。请参阅 unimplemented SQL92 features

如果您感到其中的任何限制会影响您的应用程序,那么您应该考虑使用完善的 DBMS。如果您可以解除这些限制问题,并且对快速灵活的嵌入式开源数据库引擎很感兴趣,则应重点考虑使用 SQLite。

一些能够真正表现 SQLite 优越性能的领域是 Web 站点,可以使用 SQLite 管理应用程序数据、快速应用程序原型制造和培训工具。

结束语

由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。现在,没有必要使用文本文件来实现持久存储。SQLite 之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的 SQL。这一点对于对于小型设备空间的应用程序来说尤其重要。

嵌入式数据库对于加快应用程序开发也很重要,尤其是在用于数据库抽象层(例如 PEAR::DBezSQL)时。最后,SQLite 正在积极开发中,未来一定会有新的功能,会对开源社区更有用。

阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680

原文链接https://www.ibm.com/developerworks/cn/opensource/os-sqlite/

数据持久化之嵌入式数据库 SQLite(三)的更多相关文章

  1. iphone开发中数据持久化之——嵌入式SQLite(三)

    前两篇分别讨论了使用属性列表的数据持久化.使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3.SQLite3在存储和检索大量数据方面非常有效.它还能够 ...

  2. iOS数据持久化(二)SQLite

    一.什么是SQLite SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,处理速度快,非常适合用于移动端开发. 二.使用 创建DataBaseHandle.h   &    DataB ...

  3. 将Excel文件数据导入到SqlServer数据库的三种方案

    方案一: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server,这种方法的优点是非常的灵活,可以对Excel表中的各个单元格进行用户所需的操作. openFil ...

  4. [Sqlite] 移动嵌入式数据库Sqlite日报SQL操作语句汇总

    ,EXPLAIN分析 没有建立索引之前.分析都是表扫描: sqlite> EXPLAIN SELECT *  FROM COMPANY  WHERE Salary < 20000; add ...

  5. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  6. Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储

    前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...

  7. 使用嵌入式关系型SQLite数据库存储数据

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...

  8. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  9. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

随机推荐

  1. SQL语句优化方式--进阶篇

    MYSQL性能 最大数据量 抛开数据量和并发数,谈性能都是扯淡(扯的最疼的那种).Mysql没有限制单表最大记录数,它取决与操作系统对文件大小的限制 文件系统 单文件大小限制 FAT32(采用32位二 ...

  2. elementUI table宽度自适应fit

    :fit='true' 或者直接为 fit

  3. 详细介绍如何计算两条折线的交点并使用Echarts展示以及图表优化

    1.背景 前段时间公司有个需求,需要在一个图表中展示两条折线,并且绘制出两条线的交点.为了满足需求大哥的需求,我也是着实想了有一会.下面我就把具体的实现过程给大家展示一下. 1.1.ECharts 简 ...

  4. RxJava的学习与实现

    RxJava 要在Android中使用RxJava2, 先添加Gradle配置: compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.rea ...

  5. Ubuntu18.04安装Tensorflow1.14GPU

    软件要求 必须在系统中安装以下 NVIDIA® 软件: https://www.pytorials.com/how-to-install-tensorflow-gpu-with-cuda-10-0-f ...

  6. 【week8 in ricoh】 Learning CNN

    week8:5.27 1.做CNN practical[1]里的example1,了解CNN模块中的每一个部分 (1)卷积层的卷积过程,输入输出维度变化(2)ReLU(3)Pooling层(4)Nor ...

  7. C++在windows平台下不存在strptime函数,可以绕过该函数

    https://blog.csdn.net/u011077672/article/details/50524469?utm_source=blogxgwz1

  8. Quartz.Net 任务调度之特性(3)

    再实现类中使用,就是继承IJob的类 [PersistJobDataAfterExecution] //执行后的保留作业数据,链式传参(上一次的任务数据) [DisallowConcurrentExe ...

  9. 【和孩子一起学编程】 python笔记--第三天

    第十章 游戏时间:Skier 首先安装pygame,直接在cmd命令控制框里键入pip install pygame就可以了 代码: import pygame, sys, random skier_ ...

  10. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有