手动建立数据库
手动建立数据库就是利用sqlite3工具,通过手工输入SQL命令来完成建立数据库的过程。这里来介绍一下sqlite3。sqlite3是SQLite数据库自带的一个SQL命令执行工具,它基于命令行,并可以显示命令执行结果。sqlite3工具是被集成在Android系统中的,用户在Linux的命令行界面中输入sqlite3即可启动sqlite3工具,并得到工具的版本信息,如代码清单7-21所示。
代码清单7-21 启动sqlite3工具
# sqlite3
SQLite version
Enter ".help " for instructions
sqlite>
注意:启动Linux的命令行界面的方法是在模拟器已经启动的前提下,在CMD中输入adb shell命令。
由上段代码可以看出,在启动sqlite3工具后,提示符从“#”变为“sqlite>”,表示命令行界面已经进入与SQLite数据库的交互模式,此时可以输入命令对数据库的内容进行建立、删除或修改。而正确退出sqlite3工具的方法是使用.exit命令。
代码清单7-22 退出sqlite3工具
sqlite> .exit
#
原则上,每个应用程序的数据库都保存在各自的/data/data//databases目录下,但如果使用手工方式建立数据库,则必须手工建立数据库目录,目前版本无须修改数据库目录的权限。
在SQLite数据库中,每个数据库保存在一个独立的文件中,使用sqlite3工具后加文件名的方式打开数据库文件,如果指定文件不存在,sqlite3工具则自动创建新文件。
代码清单7-23所示的代码将创建名为people的数据库,在文件系统中将产生一个名为people.db的数据库文件。
代码清单7-23 创建名为people的数据库
# sqlite3 people.db
SQLite version
Enter ".help " for instructions
sqlite>
代码清单7-24所示的代码在新创建的数据库中,构造了一个名为peopleinfo的表,使用create table命令,关系模式为peopleinfo ( _id, name, age, height)。表包含4个属性,_id是整型的主键;name表示姓名,数据类型为字符型,not null表示这个属性一定要填写,不可以为空值;age表示年龄,数据类型为整数型;height表示身高,数据类型为浮点型。
代码清单7-24 创建名为peopleinfo的表
sqlite> create table peopleinfo
...> (_id integer primary key autoincrement,
...> name text not null,
...> age integer,
...> height float);
sqlite>
为了确认数据表是否创建成功,可以使用.tables命令,显示当前数据库中的所有表。从代码清单7-25所示的代码中可以观察到,当前数据库仅有一个名为peopleinfo的表。
代码清单7-25 查看数据库中表情况
sqlite> .tables
peopleinfo
sqlite>
当然,也可以使用.schema命令查看建立表时使用的SQL命令。如果当前数据库中包含多个表,则可以使用[.schema 表名]的形式,显示指定表的建立命令,如代码清单7-26所示。
代码清单7-26 查看数据库中指定表的建立命令
sqlite>.schema
CREATE TABLE peopleinfo (_id integer primary key autoincrement,
name text not null, age integer, height float);
sqlite>
向peopleinfo表中添加数据,使用insert into … values命令,如代码清单7-27所示。
代码清单7-27 向peopleinfo表中添加数据
sqlite> insert into peopleinfo values(null,'Tom',21,1.81);
sqlite> insert into peopleinfo values(null,'Jim',22,1.78);
sqlite> insert into peopleinfo values(null,'Lily',19,1.68);
sqlite> insert into peopleinfo values(null,'Lucy',21,1.68);
sqlite> insert into peopleinfo values(null,'John',21,1.86);
代码运行成功后,数据库的peopleinfo表将有3条数据。因为_id是自增加的主键,因此在输入null后,SQLite数据库会自动填写该项的内容。终得到的表数据如表7-4所示。
表7-4 peopleinfo表数据
_id |
name |
age |
height |
1 |
Tom |
21 |
1.81 |
2 |
Jim |
22 |
1.78 |
3 |
Lily |
19 |
1.68 |
4 |
Lucy |
21 |
1.68 |
5 |
John |
21 |
1.86 |
在数据添加完毕后,使用select命令,显示指定数据表中的所有数据信息,命令格式为[select 属性 from 表名]。代码清单7-28所示的代码用来显示peopleinfo表的所有数据。
代码清单7-28 显示peopleinfo表的所有数据
select * from peopleinfo;
1|Tom|21|1.81
2|Jim|22|1.78
3|Lily|19|1.68
4|Lucy|21|1.68
5|John|21|1.86
sqlite>
上面的查询结果看起来不是非常直观,可以使用mode命令将结果输出格式更改为“表格”方式。
代码清单7-29 以表格格式显示peopleinfo表的所有数据
sqlite> .mode column
sqlite> select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
3 Lily 19 1.68
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
注意:
mode命令除了支持常见的column格式外,还支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式。
更新数据可以使用update命令,命令格式为[update 表名 set 属性=“新值” where 条件]。更新数据后,同样使用select命令显示数据,则可以确定数据是否正确更新。
代码清单7-30所示的代码将姓名为Lily数据中的高度值更新为1.88。
代码清单7-30 以表格格式显示peopleinfo表更新后的数据
sqlite> update peopleinfo set height=1.88 where name='Lily';
sqlite> select * from peopleinfo;
select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
3 Lily 19 1.68
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
删除数据可以使用delete命令,命令格式为[delete from 表名where 条件]。代码清单7-31所示的代码将_id为3的数据从表peopleinfo中删除。
代码清单7-31 删除数据
sqlite> delete from peopleinfo where _id=3;
sqlite> select * from peopleinfo;
select * from peopleinfo;
1 Tom 21 1.81
2 Jim 22 1.78
4 Lucy 21 1.68
5 John 21 1.86
sqlite>
sqlite3除了支持上述提到的增删改查的数据库操作外,对于复杂的查询,例如,order by、group by,sum、count类的聚合函数等也支持。如代码清单7-32、7-33所示。
代码清单7-32 order by
sqlite> select * from peopleinfo order by height;
select * from peopleinfo order by height;
4 Lucy 21 1.68
2 Jim 22 1.78
1 Tom 21 1.81
5 John 21 1.86
sqlite>
代码清单7-33 group by、count
sqlite> select age,count(_id) as count from peopleinfo group by age having count(_id)>1;
select * from peopleinfo order by height;
21 3
sqlite>
sqlite3工具还支持大量的命令,可以使用.help命令查询sqlite3的命令列表。以下简单介绍几种命令,如表7-5所示。
表7-5 Sqlite3支持命令
编号 |
命令 |
说明 |
1 |
.bail ON|OFF |
遇到错误时停止,默认为OFF |
2 |
.databases |
显示数据库名称和文件位置 |
3 |
.dump ?TABLE? ... |
将数据库以SQL文本形式导出 |
4 |
.echo ON|OFF |
开启和关闭回显 |
5 |
.exit |
退出 |
6 |
.explain ON|OFF |
开启或关闭适当输出模式,如果开启模式更改为column,并自动设置宽度 |
7 |
.header(s) ON|OFF |
开启或关闭标题显示 |
8 |
.help |
显示帮助信息 |
9 |
.import FILE TABLE |
将数据从文件导入表中 |
10 |
.indices TABLE |
显示表中所有列名 |
11 |
.load FILE ?ENTRY? |
导入扩展库 |
12 |
.mode MODE ?TABLE? |
设置输入格式 |
13 |
.nullvalue STRING |
打印时使用STRING代替NULL |
14 |
.output FILENAME |
将输入保存到文件 |
15 |
.output stdout |
将输入显示在屏幕上 |
16 |
.prompt MAIN CONTINUE |
替换标准提示符 |
17 |
.quit |
退出 |
18 |
.read FILENAME |
在文件中执行SQL语句 |
19 |
.schema ?TABLE? |
显示表的创建语句 |
20 |
.separator STRING |
更改输入和导入的分隔符 |
21 |
.show |
显示当前设置变量值 |
22 |
.tables ?PATTERN? |
显示符合匹配模式的表名 |
23 |
.timeout MS |
尝试打开被锁定的表ms(毫秒) |
24 |
.timer ON|OFF |
开启或关闭CPU计时器 |
25 |
.width NUM NUM ... |
设置column模式的宽度 |