前言
数据库的应用已经深入到生活和工作的方方面面,重要性已无需赘言,而对于移动领域的开发人员来说,SQLite则是在App开发中数据存储操作领域当仁不让的首选,学好SQLite对于开发移动App有着非常大的帮助。
我作为一个移动APP开发者也深感自身对于SQLite认知的不足,因此结合最近的读书和学习,准备写一系列的教程(其实就是学习笔记_,在此请允许我那啥一下)来作为学习总结。鉴于作者能力有限,文章中不会过多的出现理论方面的知识,更加注重实践的操作。如果也能对正在学习SQLite的您来说带来一点点帮助的话,那我就非常知足了!
毕竟我也只是正在SQLite领域进行探索和学习的新手,如果在文章中有错误欢十分迎您指出,我会尽力去修改和完善。
环境
因我平常大部分使用的是Mac操作系统,因此本系列的内容都是在Mac系统下使用Shell终端来完成。
SQLite简介
引用《SQLite权威指南》一书中的描述:
SQLite是一款开源的、嵌入式数据库,它没有独立运行的进程,它与所服务的应用程序在应用进程空间内共生共存。它的代码与应用程序代码也是在一起的或者说嵌入其中,作为托管它的程序的一部分。对外部观察者而言,无法明确看到这样的程序有一个关系型数据库系统(RDBMS)在运行。程序只需要做自己的事,管理自己的数据,不需要了解SQLite是如何工作的。但是在其内部有一个完整的、自我包含的数据库引擎在工作。
开始学习
- 首先为了方便查找,可以在桌面上创建一个文件夹放置我们将要创建的数据库文件,然后起个名字例如:SqliteDemo。
- 打开和数据库使用Shell操作的交互模式
打开终端,找到刚才创建的文件夹路径,例如我自己电脑上:
cd /Users/gtvapple301/Desktop/Sqlite
然后输入命令后回车:
sqlite3 test.db
虽然我们指定了数据库文件的名称test,但现在该数据库并不存在,所以文件夹中还是一片空白。SQLite直到在数据库中创建内容(例如表或者视图)时,才会创建该数据库。 - 在数据库中创建一张表,执行以下命令:
create table student (id integer primary key not null, name text, sex text, age integer, address text, phone text);
这条语句创建了一个关于学生信息的表,student是表的名称,括号里的是这张表的所有参数。create 命令是SQLite以及其他关系型数据库创建表、视图、或者索引的标准语法。语法为: create table + '表名' + ([参数名] [参数类型])。
注意:除了Shell内置的获取有关数据库内容信息的操作语句外,其他的语句末尾一定要加上;不然会导致操作失败。
此时再次打开刚才的文件夹,如果出现一个名叫test.db的文件的话说明你刚刚创建表的命令执行成功。_
这里推荐一个我平时经常使用的免费的可视化数据库浏览管理软件:
sqlitebrower
你可以用这个工具打开刚才的数据库文件,可以看到关于数据库的表、参数名称、参数数值、操作语句等各种内容。
- 向数据库的student表中插入数据
insert into student values (1, '小明', '男', 23, '北京市朝阳区', '18812345678');
insert into student (id, name, sex, age, address, phone) values (2, '小刚', '男', 27, '北京市海淀区', '18620783409');
insert into student (name, sex, age, address) values ('小红', '女', 19, '北京市东城区');
可以看到我使用了3中不同的方式向数据库的student表中分别插入了一条数据。
第一种是不声明参数直接插入数值的方式,但是有个前提,插入的数值和表中的参数必须是一一对应的,即按照参数在表中的顺序插入相应的数值。
第二种是把参数全部列出后 values后的数值一一对应着参数,其实和第一种的插入方式基本一样。
第三种是选择部分参数插入对应的数值,这里要注意的是 在创建数据库的时候 id声明了primary key 这意味着将id这项参数作为主键而且是具有自动增加的属性的,SQLite会通过查找该列的下一个值后自动产生一个,因此这里的id的值为3。
在Insert之后可以使用命令select last_insert_rowid();
来获取后一次插入的记录的id。
这里没有插入phone这个参数的数值,那么在数据库中这一项就是NULL。数据库在创建表时如果不对参数指定的话默认是NULL,但是如果我们在创建数据库的时候声明了参数的数值不能为空,例如create table student (id integer primary key not null, name text, sex text, age integer, address text, phone text not null);
,那么在插入时必须给定数值,不然则会插入失败。 - 验证数据插入是否成功
经过上述的插入操作后我们来验证数据是否插入成功,执行以下语句:
select * from student;
如果一切正常的话可以看到此次的查询结果:
Paste_Image.png
说明我们刚才的数据插入操作执行成功了_
*这里代表查询表的全部信息。
同样我们也可以只查询我们想要的参数内容
select name,address from student;
可以看到此次查询只列出我们想要的内容
select 是SQLite中非常强大的语法,从某个角度来说可以说是数据库操作的核心,它可以配合很多条件语句进行各种复杂的查询操作,我们会在后面的内容中详细来研究它的用法。
- 一些常用的SQLite的语法命令
.show
用来显示格式的配置情况。
.tables
用来获取数据库中所有创建的表。
.schema
用来获取全部的数据库创建表的模式(DDL语句),后面带着具体的表名则查询具体表的创建模式(可以理解为创建的操作语句)。
.separator
查询结果数据间的分隔符,默认是"|",可以手动改成其他的分隔符号例如","。
我们可以在Shell中执行上面的操作,如图:
Paste_Image.png
.headers on|off
用于查询结果显示时是否展示字段名。
.mode
用于改善显示格式,可选的格式有csv、column、html、insert、line、list、tabs、和tcl,每种格式都有不同的用途默认是list。
我们可以在Shell中执行上面的组合操作,结果如图:
Paste_Image.png
这两个命令组合使用,可以使查询结果的显示更加清晰明了。
一般情况下我习惯会采用column的显示格式,当然按照个人习惯和实际的需要也可以改为其他的格式,具体效果可以自己实际的操作来进行查看,再此不多做演示。
注意:我们看上面这些内置的命令语句结尾并没有加;但是却不影响数据库的执行操作,在此也印证了上面的结论。
数据的导出
使用.dump命令 可以将数据库对象导出成SQL格式的文件,不带任何参数时,.dump将整个数据库导出为数据库定义语言(DDL)和数据操作语言(DML)命令。如果带有参数,则导出匹配的给定参数的表或视图。
执行命令:
.output file.sql .dump .output stdout
执行前两个命令后 会在test.db的文件夹下创建出一个file.sql的文件,可以用记事本打开,这里我用Sublime Text打开,可以看到里面记录了我们刚才全部的SQL操作语句,如图:
.output stdout 命令则是用来将输入回复到屏幕,不执行这条命令的话,那么你在Shell中继续执行其他的操作结果都会在刚才导出的文件中显示,屏幕上不会看到执行的结果。
假如你只执行前面的两条语句而不执行
.output stdout
的话,直接执行select查询操作:select * from student;
你会发现Shell中并没有显示结果,但是file.sql文件中则显示出此次的查询结果,如图:Paste_Image.png
数据的导入
数据的导入有两种方法。如果文件有SQL语句构成(例如刚才导出的file.sql文件)可以使用.read命令可以导入文件中包含的命令。如果文件由逗号或其他分隔符分隔的值(CSV)组成,可以使用import[file][table]命令,此命令将解析指定的文件并尝试将数据插入到指定的表中。
我们先将test.db中的表删除,然后重新导入:
drop table student; .read file.sql;
首先执行drop命令将student这个表删除,相应的表里的数据也会一并被删除掉。
然后我们验证下删除是否成功,执行命令:.tables
可以看到当前数据库里已经没有表对象了,证明删除成功。
接着执行读取命令: .read file.sql;
然后执行查询操作验证是否读取成功: select * from student;
如果一切操作正常的话,可以在终端上看到数据库中之前删除的表和插入的数据再次被读取到数据库中了。
这篇介绍SQLite入门的文章暂时就到这里了,之后的文章我会找时间继续更新。其实介绍的还是不够全面,因本人能力暂时有限/(ㄒoㄒ)/~~😢,很多的知识还是需要我们不断的在以后的学习和使用中去慢慢积累。
不积跬步,无以至千里;不积小流,无以成江海。
网友评论