SQLite数据库简介

本文转自:http://blog.csdn.net/liuhe688/article/details/6712782



大家好,今天来介绍一下SQLite的相关知识,并结合Java实现对SQLite数据库的操作。

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

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


值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。

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

SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。

概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。

下面,我们就来亲自操作一下SQLite数据库。

在操作之前,朋友们要先下载SQLite数据库,官方的下载页面是http://sqlite.org/download.html,我是在Windows下试验,所以我选择了Precompiled Binaries For Windows下面的sqlite-shell-win32-x86和sqlite-analyzer-win32-x86的zip包,前者是SQLite数据库引擎,后者是SQLite数据库分析器,主要用于分析数据库的状态等信息,大家也可以根据自己的情况去下载。下载完成后分别解压,得到两个可执行文件,如图:


这两个文件可以根据自己的喜好放置在指定的位置,我将其放在D盘根目录下。下面我们就来一步一步操作SQLite:


创建数据库:

[sql]  view plain  copy
  1. D:\>sqlite3 test.db  
  2. SQLite version 3.7.7.1 2011-06-28 17:39:05  
  3. Enter ".help" for instructions  
  4. Enter SQL statements terminated with a ";"  
  5. sqlite> .databases  
  6. seq  name             file  
  7.   
  8. ---  ---------------  ----------------------------------------------------------  
  9.   
  10. 0    main             D:\test.db  
  11.   
  12. sqlite>  
我们执行了sqlite3命令,参数就是数据库的名称,如果该数据库已存在,则使用,如果不存在,则新建一个,这里我们简单的在当前位置创建了test.db,你也可以在任何存在的并且可写的目录下创建自己的数据库。(如果对于SQLite的命令不太熟悉,可以执行“.help”命令列出所有的命令清单进行查看)。


创建表:

[sql]  view plain  copy
  1. sqlite> CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);  
  2. sqlite> .tables  
  3. person  
  4. sqlite> .schema person  
  5. CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);  
  6. sqlite>  
在我们创建表之后,可以用“.tables”命令去查看已有的表,用“.schema”命令去查看表的结构,如果后面没有表名做参数,则将会输出所有表的建表语句。


插入数据:

[sql]  view plain  copy
  1. sqlite> INSERT INTO person VALUES (NULL'john', 30);  
  2. sqlite> SELECT * FROM person;  
  3. 1|john|30  


从.sql文件导入数据:

[sql]  view plain  copy
  1. sqlite> .read test.sql  
  2. sqlite> SELECT * FROM person;  
  3. 1|john|30  
  4. 2|david|35  
  5. 3|henry|40  
  6. sqlite>  


分析数据库使用状态:

[sql]  view plain  copy
  1. D:\>sqlite3_analyzer test.db  
  2. /** Disk-Space Utilization Report For test.db  
  3.   
  4. Page size in bytes.................... 1024  
  5. Pages in the whole file (measured).... 4  
  6. Pages in the whole file (calculated).. 4  
  7. Pages that store data................. 4          100.0%  
  8. Pages on the freelist (per header).... 0            0.0%  
  9. Pages on the freelist (calculated).... 0            0.0%  
  10. Pages of auto-vacuum overhead......... 0            0.0%  
  11. Number of tables in the database...... 4  
  12. Number of indices..................... 0  
  13. Number of named indices............... 0  
  14. Automatically generated indices....... 0  
  15. Size of the file in bytes............. 4096  
  16. Bytes of user payload stored.......... 39           0.95%  
  17. ...  


备份数据库:

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

[sql]  view plain  copy
  1. sqlite> .dump  
  2. PRAGMA foreign_keys=OFF;  
  3. BEGIN TRANSACTION;  
  4. CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);  
  5. INSERT INTO "person" VALUES(1,'john',30);  
  6. INSERT INTO "person" VALUES(2,'david',35);  
  7. INSERT INTO "person" VALUES(3,'henry',40);  
  8. DELETE FROM sqlite_sequence;  
  9. INSERT INTO "sqlite_sequence" VALUES('person',3);  
  10. COMMIT;  
  11. sqlite> .output dump.sql  
  12. sqlite> .dump  
  13. sqlite>  
我们可以指定输出的目标为一个文件,然后再使用命令时,输出信息就会写入指定的文件,如果想恢复为标准输出,可以这样设定:

[sql]  view plain  copy
  1. sqlite> .output stdout  
  2. sqlite> .dump  
  3. PRAGMA foreign_keys=OFF;  
  4. BEGIN TRANSACTION;  
  5. CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);  
  6. INSERT INTO "person" VALUES(1,'john',30);  
  7. INSERT INTO "person" VALUES(2,'david',35);  
  8. INSERT INTO "person" VALUES(3,'henry',40);  
  9. DELETE FROM sqlite_sequence;  
  10. INSERT INTO "sqlite_sequence" VALUES('person',3);  
  11. COMMIT;  
  12. sqlite>  

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

最后,我们可以使用“.quit”或“.exit”退出SQLite。


管理工具:

现在网络上的SQLite管理工具很多,我向大家推荐一款好用的工具:SQLite Expert。



在Java中使用SQLite:

我们要想在Java中使用SQLite,需要下载SQLite相关驱动,推荐大家到http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC页面去下载最新的驱动包,现在最新版本是sqlite-jdbc-3.7.2.jar,体积有点大,因为它包含了Linux、Mac、Windows的本地类库,如图:


下载了驱动之后,我们新建一个项目,名为sqlite:


在上图中,我们引入sqlite驱动包到类路径下,然后建立一个db的文件夹,用于放置数据库文件。最后我们看一下Test.java代码:

[java]  view plain  copy
  1. package com.scott.sqlite;  
  2. import java.sql.Connection;  
  3. import java.sql.DriverManager;  
  4. import java.sql.ResultSet;  
  5. import java.sql.Statement;  
  6.   
  7. public class Test {  
  8.     public static void main(String[] args) throws Exception {  
  9.         Class.forName("org.sqlite.JDBC");  
  10.         Connection conn = DriverManager.getConnection("jdbc:sqlite:db/test.db");  
  11.         Statement stmt = conn.createStatement();  
  12.   
  13.         stmt.executeUpdate("DROP TABLE IF EXISTS person");  
  14.         stmt.executeUpdate("CREATE TABLE person(id INTEGER, name STRING)");  
  15.         stmt.executeUpdate("INSERT INTO person VALUES(1, 'john')");  
  16.         stmt.executeUpdate("INSERT INTO person VALUES(2, 'david')");  
  17.         stmt.executeUpdate("INSERT INTO person VALUES(3, 'henry')");  
  18.         ResultSet rs = stmt.executeQuery("SELECT * FROM person");  
  19.         while (rs.next()) {  
  20.             System.out.println("id=>" + rs.getInt("id") + ", name=>" + rs.getString("name"));  
  21.         }  
  22.         stmt.close();  
  23.         conn.close();  
  24.     }  
  25. }  
执行Test.java文件,结果如下:


这个时候,在我们的db目录下,就生成了一个test.db的文件:



SQLite使用须知:

目前没有可用于 SQLite 的网络服务器。从应用程序运行位于其他计算机上的 SQLite 的惟一方法是从网络共享运行。这样会导致一些问题,像 UNIX® 和 Windows® 网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。

SQLite 只提供数据库级的锁定。

SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。


结束语:

由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android、iPhone都有内置的SQLite数据库供开发人员使用,它的易用性可以加快应用程序的开发,并使得复杂的数据存储变得轻松了许多。

注册方法 复制 license2.key 到安装目录即可。 可视化管理工具。允许用户在 SQLite 服务器上执行创建、编辑、复制、提取等操作。 SQLite Expert Professional是一款可视化的数据库管理工具,允许用户在 SQLite 服务器上执行创建、编辑、复制、提取等操作。SQLite Expert支持所有的图形界面的SQLite特征。它包括一个可视化查询生成器,一个SQL编辑与语法突出和代码自动完成,强大的table和view设计与导入导出功能。 支持平台:windows 2000,XP,VISTA,7。 可视SQL查询生成器 轻松建立复杂的SQL查询。 格式化的SQL查询文本布局。 SQL查询解析和分析的有力手段。 高级SQL编辑器与语法高亮和代码完成。 强大的重组功能 表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV文件,SQL脚本或SQLite导入数据。 数据导出到CSV文件,SQL脚本,Excel或SQLite的。 使用拖放操作之间的SQLite数据库复制表。 通过剪贴板中的数据导出到Excel。 数据编辑 在使用功能强大的就地编辑网格的编辑数据。 图像编辑器目前支持JPEG,PNG,BMP,GIF和ICO图像格式。 使用集成的十六进制编辑器可视化和修改BLOB字段。 Version 3.5 Improved license registration process. Added support for partial indexes. Added support for tables without rowid.
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值