本文为原创,如需转载,请注明作者和出处,谢谢!
现在终于到讲解数据库的时间了。数据库也是Android
存储方案的核心。在Android
系统中使用了Sqlite
数据库。Sqlite
是非常轻量的数据库。从Sqlite
的标志是一根羽毛就可以看出Sqlite
的目标就是无论是过去、现在,还是将来,Sqlite
都将以轻量级数据库的姿态出现。Sqlite
虽然轻量,但在执行某些简单的SQL
语句时甚至比MySQL
和Postgresql
还快。由于很多读者是第一次接触Sqlite
数据库,因此,在介绍如何在Android
中使用Sqlite
之前,先在本节简单介绍一下如何在PC
上建立Sqlite
数据库,以及Sqlite
数据库的一些特殊方面(由于本书的目的不是介绍Sqlite
数据库,因此,与其他数据库类似的部分(如insert
、update
等)本书将不再介绍。没有掌握这些知识的读者可以参阅其他关于数据库方面的书籍。
6.4.1 Sqlite数据库管理工具
在学习一种新技术之前,首先要做的是在自己的计算机上安装可以操作这种技术的工具。当然,这也非常符合一句成语:功欲善其事,必先利其器。虽然使用好的工具并不能使自己更好地掌握这种技术,但却能使我们的工作效率大大提升。
言归正传,现在先看看官方为我们提供了什么工具来操作Sqlite
数据库。进入官方的下载页面,网址如下:
http://www.sqlite.org/download.html
在下载页面中找到Windows
版的二进制下载包。在作者写作本书时,Sqlite
的最新版本是Sqlite3.6.2
。因此,要下载的文件是Sqlite-3_6_20.zip
。将这个zip
文件解压,发现在解压目录中只有1
个文件:sqlite3.exe
。对,这个文件就是操作Sqlite
数据库的工具(是不是很轻量?连工具都只有一个)。它是一个命令行程序,运行这个程序,进入操作界面,如图6.15
所示。
在控制台中可以输入SQL
语句或控制台命令。所有的SQL
语句后面必须以分号(;
)结尾。控制台命令必须以实心点(.
)开头,例如,.help
(显示帮助信息);.quit
(退出控制台);.tables
(显示当前数据库中所有表名)。
虽然可以在Sqlite
的控制台中输入SQL
语句来操作数据库,但输入大量的命令会使工作量大大增加。因此,我们必须要使用所谓的“利器”来取代这个控制台程序。
由于Sqlite
提供了各种类型的程序接口,因此,可以管理Sqlite
数据库的工具非常多,下面是几个比较常用的Sqlite
管理工具。
SQLite Database Browser
http://sourceforge.net/projects/sqlitebrowser
SQLite Expert Professional
http://www.sqliteexpert.com
Sqlite Developer
http://www.sqlitedeveloper.com
sqliteSpy
http://www.softpedia.com/progDownload/SQLiteSpy-Download-107386.html
作者在写作本书时使用了SQLiteExpert Professional
,这也是作者推荐使用的Sqlite
管理工具。该工具拥有大量的可视化功能,例如,建立数据库、建立表、SQL Builder
等工具。图6.16
是SQLite ExpertProfessional
的主界面。
6.4.2 创建数据库和表
使用SQLite
控制台工具(sqlite3.exe
)建立数据库非常简单,只需要输入如下的命令就可以建立或打开数据库。
sqlite3.exe test.db
如果数据库(test.db
)存在,则打开该数据库,如果数据库不存在,则预建立test.db
文件(这时并不生成test.db
文件,直到在Sqlite
控制台中执行与数据库组件(表、视图、触发器等)相关的命令或SQL
语句才创建test.db
文件。
如果想使用sqlite.exe
命令同时建立数据库和表,可以先建立一个sql.script
文件(也可以是其他文件名),并在其中输入如下的SQL
语句:
create table table1 (
id integerprimary key,
age int,
name text
);
create table table2(
idinteger primary key,
type_idinteger,
name text
);
然后执行如下的命令,就会在建立test.db
文件的同时,在该test.db
文件中建立table1
和table2
两个表。
sqlite3.exe test.db < sql.script
在使用createtable
语句创建表时还可以为每一个字段指定默认值,如下面的SQL
语句所示:
create table table1 (
id integerprimary key,
age int default 20,
name text
);
create table table2(
id integerprimary key,
type_idinteger,
name text default 'name1'
);
6.4.3 模糊查询
Sqlite
的模糊查询与其他数据库类似,都使用了like
关键字和%
通配符。不过Sqlite
在处理中文时会遇到一些麻烦。例如,使用下面的SQL
语句向table2
插入了一条记录。
insert into table2(id, type_id, name) values(1, 20,'
手机操作系统');
在Sqlite
控制台中使用如下的SQL
查询是没有问题的。
select * from table2 where name =
'
手机操作系统';
但如果使用下面的模糊查询语句,则无法查询到记录。
select * from table2 where name like
'
手机%';
发生这种事情的原因是因为Sqlite
控制台在保存中文时使用的编码格式是GB2312
,而执行like
操作时使用的是UTF-8
。读者可以使用如下的命令来查看Sqlite
控制台当前的编码格式。
PRAGMA encoding;
为了可以使用like
模糊查询中文,作者建议使用6.4.1
节介绍的SQLite Expert Professional
来执行insert
、update
等SQL
语句来编辑数据。在这个工具中会直接使用UTF-8
来保存中文。
6.4.4 分页显示记录
分页是在Web
应用中经常被提到的概念。基本原理是从数据库中获得查询结果的部分数据,然后显示在页面中。虽然本书并没有介绍Web
程序的开发,但获得查询结果的部分数据仍然非常重要。
Sqlite
和MySQL
相同,都使用了limit
关键字来限制select
语句返回的记录数。limit
需要两个参数,第1
个参数表示返回的子记录集在父记录集的开始位置(从0
开始),第2
个参数表示返回子记录集的记录数。第2
个参数为可选值,如果不指定这个参数,会获得从起始位置开始往后的所有记录。例如,下面的select
语句返回了table2
表中从第11
条记录开始的100
条记录。
select * from table2 limit 10 100
6.4.5 事务
如果一次执行多条修改记录(insert
、update
等)的SQL
语句,那么当某一条SQL
语句执行失败时,就需要取消其他SQL
语句对记录的修改。否则就会造成数据不一致的情况。而事务是解决这个问题的最佳方法。
在Sqlite
中可以使用BEGIN
来开始一个事件,例如,下面的代码执行了两条SQL
语句,如果第2
条语句执行失败,那么第1
条SQL
语句执行的结果就会回滚,相当于没执行这条SQL
语句。
BEGIN;
insert into table1(id, name) values(50,'Android');
insert into table2(id, name) values(1, '
测试');
如果想显式地回滚记录的修改结果,可以使用ROLLBACK
语句,代码如下:
BEGIN;
delete from table2;
ROLLBACK;
如果想显式地提交记录的修改结果,可以使用COMMIT
语句,代码如下:
BEGIN;
delete from table2;
COMMIT;
新浪微博:http://t.sina.com.cn/androidguy 昵称:李宁_Lining