本文由公众号码农修仙儿独家发布,微信搜索fanfan_code
目录
Sqlite简介
Sqlite创建表语句
Sqlite增加insert语句
Sqlite查询表select
Sqlite更新数据update
表排序order by
查询某段数据limit和offset
删除表drop
demo演示
SQLite简介
SQLite属于轻量级的数据库。用起来也很方便。
和文件相比,sqlite表中存储的是一系列的有规则的数据对象,每个对象都有固定的某些数据。
所以,你究竟要选择何种存储方式就看你自己的数据对象的特点了
Android中有现成的对数据库操作的api—SqliteDatabase.这些api其实也不过是拼接成一个sql语句,只有搞清楚了sql语句的规则,才能更好的发挥作用
sqlite语句中常用的有这么几类,sql对大小写不敏感
定义表Table(把整个table作为一个整体考虑)
create:创建表
drop:删除表
操作表Table(传说中的写表)
insert:向表中插入数据
update:更新表中的数据
delete:删除表中的数据
浏览表Table(传说中的读表)
select:查询表中的数据
为了更直观的感受sqlite的命令语法,直接使用sqlite3命令行工具,在terminal执行命令,来演示下各大神通.
稳定军心,创建表create
创建表语句结构:create table table_name (col1 datatype,col2 datatype,col3 …);
以员工数据库为例,来创建一个worker表,先分析下每一个worker需要包含几种信息
编号ID,员工的唯一标识
姓名name
年龄age
部门section
工资wage
暂时定义这几列,接下来就可以开始创建table了
1sqlite> create table worker
2 (
3 id int primary key not null,
4 name text not null ,
5 age int not null,
6 address char(50) not null,
7 wage real
8 );
至此,我们创建了一个worker的表,可以使用.table查看你创建的表。
是不是感觉表中的每一行数据像是一个对象,然后每一列是该对象所包含的成员?
注意,为了看起来简单明了,上述语句我添加了换行,所以直接复制粘贴是不可以的,老老实实自己敲吧
当然,我在创建表之前,已经使用sqlite3 testDB.db创建过数据库了,所以目前表存在于testDB.db数据库中了
1sqlite> .tables
2COMPANY DEPARTMENT worker
如果你想要再看一眼自己的create创建表语句,可以使用.schema worker命令
1sqlite> .schema worker
2CREATE TABLE worker
3 (id int primary key not null,
4 name text not null,
5 age int not null,
6 address char(50) not null,
7 wage real);
增加数据insert
向表中插入数据有两种方式
向表中插入某些特定列的数据:insert into table (col1,col2…) values (data1,data2…);
向表中的所有列插入数据,此时既然是所有列,那么就可以省略列名,但是数据必须是所有列的数据:insert into table values (data1,data2…enddata);
好,首先是给部分列赋值
1sqlite> insert into worker (name, age, address) values (‘fanfan’,27, ‘HeNan’);
2Error: NOT NULL constraint failed: worker.id
我选择赋值一组数据的name, age,address这三列,竟然报错,说是worker.id 不能是null,这是为什么?
还记得创建表语句中吗?不记得可以用.schema命令查看一下。
在创建表时,我们在每一个数据类型后有写not null,也就是要求非空。
所以赋值时要求非空的列是必须要赋值的。
那就添加上id,ok,没报错,赋值应该完成了
1sqlite> insert into worker (name, age, address,id) values (‘fanfan’,27, ‘HeNan’,1);
2sqlite>
看一下表中是否有数据
1sqlite> select * from worker;
21|fanfan|27|HeNan|
3sqlite>
这样的打印格式看起来不太舒服,一没有显示列名,二每个数据紧贴着。
执行两个命令
.header on:用于显示出列名
.mode column:用于制表
效果如下所示
1sqlite> .header on --显示列名
2sqlite> select * from worker;
3id|name|age|address|wage
41|fanfan|27|HeNan|
5sqlite> .mode column --制表
6sqlite> select * from worker;
7id name age address wage
8---------- ---------- ---------- ---------- ----------
91 fanfan 27 HeNan
10sqlite>
好,看来第一种insert方案成功,接下来测试第二种,为每一列添加数据,添加时默认按照创建表时的列的顺序进行赋值
1sqlite> insert into worker values(2,‘coder’,26,‘HeBei’,15000);
查看一下是否insert成功
1sqlite> select * from worker;
2id name age address wage
3---------- ---------- ---------- ---------- ----------
41 fanfan 27 HeNan
52 coder 26 HeBei 15000.0
查询表select
查询和插入对应,也是有两种基本的查询方式
查询某些特定列的数据:select col1,col2… from table_name;表格横向展示的列按照col1,col2对应显示
查询所有列的数据:select * from table_name;因为对列的展示不做要求,所以按照默认创建表格时的列进行横向显示
在insert中已经演示过查询所有列了
1sqlite> select * from worker;
2id name age address wage
3---------- ---------- ---------- ---------- ----------
41 fanfan 27 HeNan
52 coder 26 HeBei 15000.0
6sqlite>
如果只关心name和age
1sqlite> select name, age from worker;
2name age
3---------- ----------
4fanfan 27
5coder 26
6sqlite>
如果不在table_name后添加查询条件,那么会展示出表中所有的对象,也就是所有行的数据。
只不过要展示对象的哪些成员也就是对象的哪些列,需要有select后的条件决定。
那如果不想查询所有数据,只是想查询某些行数据该怎么做呢?添加where查询条件
select colunm1,column2… (用于决定查询哪些列)from table_name where conditions(用于决定查询哪些行)
conditions可以是一个范围也就是多行,也可以是具体的值也就是一行。
配合where使用的可以有and ,or等运算符或者逻辑运算。
比如
具体某一行,id = 2
多行,id > 2
多个条件and查询,id > 2 and name > ‘fan’
多个条件or查询,id > 2 || name > ’fan‘
查询条件不确定范围,使用like,找相似,比如where name like ‘_fan%’,表示寻找第二,三,四位确定为fan的满足条件的name
更新update
更新一般针对的是一行数据,也就是表中的某一个对象.
那也即是说在更新之前首先你必须确定你要更新的是哪一个对象。
也就是
必须要明确的查找到你需要更新的对象:也就是哪一行数据
必须要明确你需要更新对象的哪些列数据:也就是更新哪些列数据(可以是一行或者多行)
所以基本语句是update table_name set col1=data1,col2=data2… where [conditions];
比如,将第二行对象的name更新为android,将第二行对象的age更新为25
1sqlite> update worker set name = ‘android’, age = 25 where id = 2;
执行之后记得查询一下看修改是否正确
1sqlite> select * from worker;
2id name age address wage
3---------- ---------- ---------- ---------- ----------
41 fanfan 27 HeNan
52 android 25 HeBei 15000.0
6sqlite>
当然你也可以一次性修改多行,这都取决于你的where之后的条件
删除数据
删除是针对整个行来说的,也就是说是删除一行还是多行。
删除语句结构为:delete from table_name where [conditions];
所以,要删除一行还是多行,就取决于conditions了。
比如,删除id为2的数据
1sqlite> delete from worker where id = 2;
2sqlite> select * from worker;
3id name age address wage
4---------- ---------- ---------- ---------- ----------
51 fanfan 27 HeNan
6sqlite>
表排序order by
除了基本操作,还有排序操作也会经常遇到
排序分为
升序ascend或者是降序descend.语法中分别未asc和desc
按哪一列排序,也就是说要根据哪一列的比较结果来排序
在查询时进行排序的基本语句结构可以是
select * from table_name order by [col1,col2] [asc | desc];
先向worker表中添加一些数据,之后分别以name为标准进行升序和降序输出
1sqlite> select * from worker order by name asc;
2id name age address wage
3---------- ---------- ---------- ---------- ----------
43 bin 22 BeiJing 22000.0
51 fanfan 27 HeNan
64 ke 23 BeiJing 25000.0
75 lun 24 ShangHai 20000.0
86 rui 24 ShenZhen 23000.0
92 wo 22 HeBei 12000.0
107 you 25 XiAn 23000.0
11sqlite> select * from worker order by name desc;
12id name age address wage
13---------- ---------- ---------- ---------- ----------
147 you 25 XiAn 23000.0
152 wo 22 HeBei 12000.0
166 rui 24 ShenZhen 23000.0
175 lun 24 ShangHai 20000.0
184 ke 23 BeiJing 25000.0
191 fanfan 27 HeNan
203 bin 22 BeiJing 22000.0
21sqlite>
查询某段数据limit和offset
select * from table_name limit nums offset start_offset
从偏移量start_offset开始,查找nums行数据
1sqlite> select * from worker limit 3 offset 1;
2id name age address wage
3---------- ---------- ---------- ---------- ----------
42 wo 22 HeBei 12000.0
53 bin 22 BeiJing 22000.0
64 ke 23 BeiJing 25000.0
7sqlite>
删除表drop
至此,对数据库的所有基本操作差不多介绍完了,你学会了吗?
敢不敢把表删除重新自己演示一遍呢?
准备好了吗?你现在要删除你创建的表了
删除表也很简单 drop table table_name
如果有多个数据库,那么可以指定drop table
database_name.table_name
接下来删除worker
1sqlite> drop table worker;
2sqlite> .tables
3COMPANY DEPARTMENT
4sqlite>
接下来就看你自由发挥了….
动手做一遍,发现很多程序员都眼高手低,搞个demo测试一下
Demo练手
创建表
1sqLiteDatabase.execSQL(Constants.CREATE_WORKER);
查询表
1public WorkerBean queryWorker(String old_name){
2 WorkerBean workerBean = null;
3 sqLiteDatabase = workerOpenHelper.getWritableDatabase();
4 if (sqLiteDatabase != null && sqLiteDatabase.isOpen()) {
5
6 Cursor cursor = sqLiteDatabase.query(Constants.TABLE_WORKER, null, Constants.NAME + “=?”,
7 new String[]{old_name}, null, null, null);
8 if (cursor != null) {
9 if (cursor.moveToFirst()){
10 workerBean = getWorker(cursor);
11 }
12 cursor.close();
13 }
14
15 sqLiteDatabase.close();
16 }
17 return workerBean;
18 }
增加数据
1public long insertWorker(WorkerBean worker){
2 long row = -1;
3 sqLiteDatabase = workerOpenHelper.getWritableDatabase();
4 if (sqLiteDatabase != null && sqLiteDatabase.isOpen()){
5 ContentValues values = new ContentValues();
6 values.put(Constants.NAME, worker.getName());
7 values.put(Constants.AGE, worker.getAge());
8 values.put(Constants.ADDRESS, worker.getAddress());
9 values.put(Constants.WAGE, worker.getWage());
10 row = sqLiteDatabase.insert(Constants.TABLE_WORKER,null,values);
11 sqLiteDatabase.close();
12 }
13 return row;
14 }
更新数据
1public int updateWorker(String old_name, WorkerBean worker){
2 int row = -1;
3 sqLiteDatabase = workerOpenHelper.getWritableDatabase();
4 if (sqLiteDatabase != null && sqLiteDatabase.isOpen()) {
5 ContentValues values = new ContentValues();
6 values.put(Constants.NAME, worker.getName());
7 values.put(Constants.AGE, worker.getAge());
8 values.put(Constants.ADDRESS, worker.getAddress());
9 values.put(Constants.WAGE, worker.getWage());
10 row = sqLiteDatabase.update(Constants.TABLE_WORKER, values, Constants.NAME + “=?”, new String[]{old_name});
11 sqLiteDatabase.close();
12 }
13 return row;
14 }
文章链接
跟我一起学OPP(六)—密码本
跟我一起学hfp(三) —接听、挂断电话
跟我一起学蓝牙BLE篇(二)— BLE相关api
跟我一起学蓝牙基础篇(三)—初识协议栈
SELinux安全权限导致蓝牙无法开启问题记录
跟我一起学OPP(五) — client发送文件源码分析
跟我一起学OPP(四) — Server接收源码跟踪分析
跟我一起学蓝牙基础篇(四)—Profile
跟我一起学OPP(三)—Server初现
welcome to 程序员的世界
…
扫描上方二维码关注公众号,查看更多干货文章
Demo下载地址
https://github.com/fanfanblog/SQLite