SQLite Database Browser, a graphical client to access SQLite databases
SqlPro SQL Client, another graphical client to work with SQLite databases。
用PHP操作sqlite数据库
a、 如何连接sqlite数据库?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
select * from sqlite_master;echo "数据库连接成功!";
} else {
die($sqliteerror);
}
b、 如何列出数据库中所有的表?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select * from sqlite_master;');
foreach ($result as $entry) {
echo 'talbe name='.$entry['name']."n";
echo 'sql='.$entry['sql']."n";
echo "--------------------------------------------------------------------------------";
sqlite_close($db);
} else {
die($sqliteerror);
}
c、 对sqlite数据库的查询,以及
结果集
的显示
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);
echo "user表查询结果:n";echo " n name emailn";
foreach ($result as $entry) {
echo ' '.$entry['name']." " $entry['email']."n";
echo ' ';sqlite_close($db);
} else {
die($sqliteerror);
}
sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");
sqlite_query($db, "delete from user where user=’user99’");
sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');
用JAVA连接SQLite
先下载SQLite数据库的JDBC
这里给出一个中文站点的URL:(参见
扩展阅读
)
将下载到的包解压后得到jar包 sqlitejdbc-v033-nested.jar 放到%JAVA_HOME%\lib 下,
并且将其添加到classpath系统
环境变量
中,我的classpath系统环境变量为:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar
在你的代码中引用这个驱动:
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");//filename为你的SQLite数据名称
// ... use the database ...
conn.close();
示例程序如下:
import java.sql.*;
import org.sqlite.JDBC;
/** 这是个非常简单的SQLite的Java程序,
* 程序中创建数据库、创建表、然后插入数据,
* 最后读出数据显示出来*/
public class TestSQLite{
public static void main(String[] args){
//连接SQLite的JDBC
Class.forName("org.sqlite.JDBC");
//建立一个数据库名zieckey.db的连接,如果不存在就在当前目录下创建之
Connection conn =DriverManager.getConnection("jdbc:sqlite:zieckey.db");
Statement stat = conn.createStatement();
stat.executeUpdate("create table tbl1(name varchar(20), salary int);");//创建一个表,两列
stat.executeUpdate("insert into tbl1values('ZhangSan',8000);");//插入数据
stat.executeUpdate("insert into tbl1values('LiSi',7800);");
stat.executeUpdate("insert into tbl1values('WangWu',5800);");
stat.executeUpdate("insert into tbl1values('ZhaoLiu',9100);");
ResultSet rs = stat.executeQuery("select * from tbl1;");//查询数据
while(rs.next()){//将查询到的数据打印出来
System.out.print("name = "+ rs.getString("name")+" ");//列属性一
System.out.println("salary = "+ rs.getString("salary"));//列属性二
rs.close();
conn.close();//结束数据库的连接
}catch(Exception e ){
e.printStackTrace();
E:\Coding\java\test>javac TestSQLite.java
# 编译运行:
E:\Coding\java\test>java TestSQLite
name = ZhangSan salary = 8000
name = LiSi salary = 7800
name = WangWu salary = 5800
name = ZhaoLiu salary = 9100
总结:本文介绍了
嵌入式数据库
SQLite在Java中的应用,
通过
创建表
、插入数据、查询等操作介绍了在Java中对数据库的操纵。
先下载ADO
.NET
2.0 Provider for SQLite。下载
bin
aries zip版就可以了。下载完后解压缩,可以在bin目录下找到
System.Data.SQLite
.DLL。在
vs2008
中用Add Reference(添加引用)功能把System.Data.SQLite.DLL加到
工程里
就可以了。运行下面代码
试试:
string datasource = "e:/tmp/test.db";
System.Data.SQLite.SQLiteConnection.CreateFile(datasource);
//连接数据库
System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();
System.Data.SQLite.SQLiteConnectionStringBuilder connstr = new System.Data.SQLite.SQLiteConnectionStringBuilder();
connstr.DataSource = datasource;connstr.Password = "admin";//设置密码,SQLite ADO.NET实现了数据库密码保护
conn.ConnectionString = connstr.ToString();conn.Open();
//创建表
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();
string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";
cmd.CommandText = sql;
cmd.Connection = conn;cmd.ExecuteNonQuery();
//插入数据
sql = "INSERT INTO test VALUES('a','b')";
cmd.CommandText = sql;cmd.ExecuteNonQuery();
//取出数据
sql = "SELECT * FROM test";
cmd.CommandText = sql;
System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
while (reader.Read()){
sb.Append("username:").Append(reader.GetString(0)).Append("\n").Append("password:").Append(reader.GetString(1));
MessageBox.Show(sb.ToString());
使用linux下的C操作SQLLITE
由于linux下侧重使用命令,没有win的操作容易上手,所以在测试C操作SQLITE时会比较容易出现错误,给大家做一个简单的程序进行测试,演示怎么应用。
#include <stdio.h>
#include "sqlite3.h"
int main( void ){
sqlite3 *db = NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("zieckey.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}else
printf("You have opened a sqlite3 database"
" named zieckey.db successfully!\n"
"Congratulations! Have fun ! ^-^ \n");
sqlite3_close(db); //关闭数据库
return 0;
}
退出,保存。(代码输入完成后,按下 Esc 键,然后输入: :wq ,回车就好拉)
好拉,编译:
[root@localhost temp]# gcc opendbsqlite.c -o db.out
或者遇到这样的问题:
[root@localhost temp]# gcc opendbsqlite.c -o db.out
opendbsqlite.c:11:21: sqlite3.h: 没有那个文件或目录
opendbsqlite.c: In function `main':
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function)
opendbsqlite.c:19: (Each undeclared identifier is reported only once
opendbsqlite.c:19: for each function it appears in.)
opendbsqlite.c:19: `db' undeclared (first use in this function)
也许会碰到类似这样的问题:
[root@localhost temp]# gcc opendbsqlite.c -o db.out
/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main':
: undefined reference to `sqlite3_errmsg'
/tmp/ccTkItnN.o(.text+0x67): In function `main':
: undefined reference to `sqlite3_close'
/tmp/ccTkItnN.o(.text+0x8f): In function `main':
: undefined reference to `sqlite3_close'
collect2: ld returned 1 exit status
[root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/
include
这样编译应该就可以了
如果还是有错误的话请搜索:(一)Sqlite数据库连接。有更详细的说明解释
SQLite 有许多
内置函数
用于处理
字符串
或
数字数据
。下面列出了一些有用的 SQLite 内置函数,且所有函数都是大
小写
不敏感,这意味着您可以使用这些函数的小写形式或大写形式或混合形式。欲了解更多详情,请查看 SQLite 的官方文档:
序号 函数 & 描述
1 SQLite COUNT 函数 SQLite COUNT
聚集函数
是用来计算一个数据库表中的行数。
2 SQLite MAX 函数 SQLite MAX
聚合函数
允许我们选择某列的
最大值
。
3 SQLite MIN 函数 SQLite MIN
聚合函数
允许我们选择某列的
最小值
。
4 SQLite
AVG
函数 SQLite AVG 聚合函数计算某列的
平均值
。
5 SQLite SUM 函数 SQLite SUM 聚合函数允许为一个数值列计算总和。
6 SQLite RANDOM 函数 SQLite RANDOM 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。
7 SQLite
ABS
函数 SQLite ABS 函数返回数值参数的
绝对值
。
8 SQLite UPPER 函数 SQLite UPPER 函数把字符串转换为
大写字母
。
9 SQLite LOWER 函数 SQLite LOWER 函数把字符串转换为
小写字母
。
10 SQLite LENGTH 函数 SQLite LENGTH 函数返回字符串的长度。
11 SQLite sqlite_version 函数 SQLite sqlite_version 函数返回 SQLite 库的版本。
从某种程度上说,SQLite最初的构思是在一条军舰上进行的。当时在
通用动力
工作的SQLite的作者
D. Richard Hipp正在为
美国海军
编制一种使用在
导弹驱逐舰
上的程序。那个程序最初运行在
Hewlett-Packard
UNIX(HPUX)上,后台使用Informix数据库。对那个具体应用而言,Informix有点儿太强大了。一个有经验的
数据库管理员
(DBA)安装或升级Informix可能需要一整天,如果是没经验的程序员,这个工作可能永远也做不完。真正需要的只是一个自我包含的数据库,它易使用并能由程序控制传导,另外,不管其他软件是否安装,它都可以运行。
2000年1月,Hipp开始和一个同事讨论关于创建一个简单的嵌入式
SQL数据库
的想法,这个数据库将使用GNU DBM哈希库(gdbm)做后台,同时这个数据库将不需要安装和
管理支持
。后来,一有
空闲时间
,Hipp就开始实施这项工作,2000年8月,SQLite 1.0版发布了。
按照原定计划,SQLite 1.0用gdbm作为存储管理器。然而,Hipp不久就用自己实现的能支持事务和记录按
主键
存储的
B-tree
替换了gdbm。随着第一次重要升级的进行,SQLite有了稳定的发展,功能和用户也在增长。2001年中期,很多项目--开源的或商业的--都开始使用SQLite。在随后的几年中,
开源社区
的其他成员开始为他们喜欢的脚本语言和
程序库
编写SQLite扩展。一个接着一个,既Perl、Python、
Ruby
、
Java
和其他主流的
程序设计语言
的扩展之后,新的扩展如SQLite的
ODBC
接口出现并证明了SQLite的广泛应用和实用功能。
2004年,SQLite从版本2升级到版本3,这是一次重大升级。
以下是之后的版本更新历史,可以在官网查询到。
2004-06-09 - Version 2.8.14
2004-06-18 - Version 3.0.0
2007-09-04 - Version 3.5.0
2008-07-16 - Version 3.6.0
2008-11-19 - Version 3.6.6
2009-11-04 - Version 3.6.20
2010-03-09 - Version 3.6.23
2010-07-22 - Version 3.7.0
2010-08-24 - Version 3.7.2
2011-02-01 - Version 3.7.5
2012-06-11 - Release 3.7.13
2012-09-03 - Release 3.7.14
2012-12-12 - Release 3.7.15
2013-03-18 - Release 3.7.16
2013-05-20 - Release 3.7.17
2013-08-26 - Release 3.8.0
2013-10-17 - Release 3.8.1
2013-12-06 - Release 3.8.2
2014-02-03 - Release 3.8.3
2014-03-10 - Release 3.8.4
2014-06-04 - release 3.8.5
2014-08-15 - Release 3.8.6
2014-10-08 - Release 3.8.7
2015-01-16 - Release 3.8.8
在确定是否在
应用程序
中使用 SQLite 之前,应该考虑以下几种情况:
-
有没有可用于 SQLite 的网络服务器。从应用程序运行位于其他计算机上的 SQLite 的惟一方法是从网络共享运行。这样会导致一些问题,像 UNIX® 和 Windows® 网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。
-
SQLite 只提供数据库级的锁定。虽然有一些增加并发的技巧,但是,如果应用程序需要的是表级别或行级别的锁定,那么 DBMS 能够更好地满足您的需求。
-
正如前面提到的,SQLite 可以支持每天大约 100,00 次点击率的 Web 站点 —— 并且,在某些情况下,可以处理 10 倍于此的通信量。对于具有高通信量或需要支持庞大浏览人数的 Web 站点来说,应该考虑使用 DBMS。
-
SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。
-
SQLite 支持多数(但不是全部)的 SQL92 标准。不受支持的一些功能包括完全触发器支持和可写视图。
如果您感到其中的任何限制会影响您的应用程序,那么您应该考虑使用完善的 DBMS。如果您可以解除这些限制问题,并且对快速灵活的嵌入式开源数据库引擎很感兴趣,则应重点考虑使用 SQLite。
一些能够真正表现 SQLite 优越性能的领域是 Web 站点,可以使用 SQLite 管理应用程序数据、快速应用程序原型制造和培训工具。
由于资源占用少、性能良好和零
管理成本
,
嵌入式数据库
有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。如今没有必要使用
文本文件
来实现持久存储。SQLite 之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的 SQL。这一点对于对于小型
设备空间
的应用程序来说尤其重要。
嵌入式数据库对于加快应用程序开发也很重要,尤其是在用于
数据库抽象层
(例如PEAR::
DB
或ezSQL)时。最后,SQLite 正在积极开发中,未来一定会有新的功能,会对
开源社区
更有用。
1、WAL恢复法
WAL
是
关系型数据库
中用于实现事务性和
持久性
的一系列技术。数据文件(存储着表和索引)的修改必须在这些动作被WAL记录之后才被写入,即在描述这些改变的日志记录被刷到持久存储以后,数据库在执行命令之前先将它记下来。比如,人们平时会写备忘录,记录自己要做的事,WAL就是那个备忘录。SQLite3可以通过命令“PRAGMA journal_mode=WAL”打开WAL模式。
SQLite中的
数据存储
在B+tree叶子页的单元Data(1~N)区中,其单元结构如图所示,其中Payload-size表示Payload的大小;Row ID表示当前单元序号;而
Header
-size表示包括其本身在内的
记录头
的大小。在B+tree数据结构中,描述单元相关信息的单元头和记录Type字段总数的记录头都以可变长整数形式里。
然而,SQLite中所存储的整数在分析被删除数据的时候,在可变长度区域中可能会存在模糊定位的问题,这无疑会给
数据恢复
造成困难。因此,为了恢复被删除的数据的深度,必须确定每个可变长度区域的确切长度。
SQLite 删除数据后(或WAL模式下
检查点
触发后),SQLite会初始化对应单元的前4字节。其中,前2字节表示下一自由块的
偏移量
,后2字节则表示当前自由块的大小。由于删除操作仅改变单元前4字节,且Type1的类型被设为NULL,只占1个字节,因此以可变长整数形式存储的Payload Size、Row ID以及 Header-size三个区域,无论每个区域占据多少字节,真正
存储数据
的Type(2~N)和Data区域均未改变。这样,既节省空间,又保持了数据的一致性,同时还为恢复数据带来便利。为了恢复数据库表中存储的具体数据,必须确认
数据记录
区,也就是Data区域中每种类型的数据所占的字节数。而想要确认这一点,就必须先确定单元内容区,也就是Payload区域中每个Type字段的长度值。由于
数据删除
仅改变单元前4字节,无法准确得知各字段的大小。为了解决这一问题,根据删除后Type(2~N)与Data区域均未改变,由于Payload Size、Row ID以及 Headersize三个区域存在结束标志,并且每款
安卓手机
各表字段个数固定,因此可以通过探测每个Type字段范围并计算其大小,确定预提取的数据在表中相应的位置,以及确定每个字段对应的Data区域大小,然后准确读取每个Data区域所存储的数据,通过一定的编码转译,来实现数据的恢复。