现在终于到讲解数据库的时间了。数据库也是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
数据库。进入官方的下载页面,网址如下:
在下载页面中找到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
sqlite expert professional
sqlite developer
sqlitespy
作者在写作本书时使用了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;
《android开发完全讲义(第2版)》(本书凯发k8网页登录的版权已输出到台湾)
《android高薪之路:android程序员面试宝典 》
新浪微博: 昵称:李宁_lining