Sqlite数据库使用---基础研究

Posted 码农修仙儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlite数据库使用---基础研究相关的知识,希望对你有一定的参考价值。


目录

  • Sqlite简介

  • Sqlite创建表语句

  • Sqlite增加insert语句

  • Sqlite查询表select

  • Sqlite更新数据update

  • 表排序order by

  • 查询某段数据limitoffset

  • 删除表drop

  • demo演示

SQLite简介

SQLite属于轻量级的数据库。用起来也很方便。

和文件相比,sqlite表中存储的是一系列的有规则的数据对象,每个对象都有固定的某些数据。

所以,你究竟要选择何种存储方式就看你自己的数据对象的特点了

android中有现成的对数据库操作的api---SqliteDatabase.这些api其实也不过是拼接成一个sql语句,只有搞清楚了sql语句的规则,才能更好的发挥作用

sqlite语句中常用的有这么几类,sql对大小写不敏感

定义表Table(把整个table作为一个整体考虑)

  1. create:创建表

  2. drop:删除表

操作表Table(传说中的写表)

  1. insert:向表中插入数据

  2. update:更新表中的数据

  3. delete:删除表中的数据

浏览表Table(传说中的读表)

  • select:查询表中的数据

为了更直观的感受sqlite的命令语法,直接使用sqlite3命令行工具,在terminal执行命令,来演示下各大神通.

稳定军心,创建表create

创建表语句结构:create table table_name (col1 datatype,col2 datatype,col3 …);

以员工数据库为例,来创建一个worker表,先分析下每一个worker需要包含几种信息

  1. 编号ID,员工的唯一标识

  2. 姓名name

  3. 年龄age

  4. 部门section

  5. 工资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(50not null
7  wage real);

增加数据insert

向表中插入数据有两种方式

  1. 向表中插入某些特定列的数据:insert into table (col1,col2..) values (data1,data2...);

  2. 向表中的所有列插入数据,此时既然是所有列,那么就可以省略列名,但是数据必须是所有列的数据:insert into table  values (data1,data2...enddata);

好,首先是给部分列赋值

1sqlite> insert into worker (name, age, addressvalues ('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,idvalues ('fanfan',27'HeNan',1);
2sqlite>

看一下表中是否有数据

1sqlite> select * from worker;
21|fanfan|27|HeNan|
3sqlite>

这样的打印格式看起来不太舒服,一没有显示列名,二每个数据紧贴着。
执行两个命令

  1. .header on:用于显示出列名

  2. .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

查询和插入对应,也是有两种基本的查询方式

  1. 查询某些特定列的数据:select  col1,col2.. from table_name;表格横向展示的列按照col1,col2对应显示

  2. 查询所有列的数据: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> 

如果只关心nameage

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等运算符或者逻辑运算。

比如

  1. 具体某一行,id = 2

  2. 多行,id > 2

  3. 多个条件and查询,id > 2 and name > ‘fan’

  4. 多个条件or查询,id > 2 || name > ’fan‘

  5. 查询条件不确定范围,使用like,找相似,比如where name like '_fan%',表示寻找第二,三,四位确定为fan的满足条件的name

更新update

更新一般针对的是一行数据,也就是表中的某一个对象.

那也即是说在更新之前首先你必须确定你要更新的是哪一个对象。
也就是

  1. 必须要明确的查找到你需要更新的对象:也就是哪一行数据

  2. 必须要明确你需要更新对象的哪些列数据:也就是更新哪些列数据(可以是一行或者多行)

所以基本语句是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

除了基本操作,还有排序操作也会经常遇到
排序分为

  1. 升序ascend或者是降序descend.语法中分别未ascdesc

  2. 按哪一列排序,也就是说要根据哪一列的比较结果来排序

在查询时进行排序的基本语句结构可以是
select * from table_name order by [col1,col2] [asc | desc];

先向worker表中添加一些数据,之后分别以name为标准进行升序和降序输出

 1sqliteselect * 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   
11sqliteselect * 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行数据

1sqliteselect * 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}, nullnullnull);
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    }

增加数据

Sqlite数据库使用---基础研究

 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    }




文章链接

....



你点的每个赞,我都认真当成了喜欢


以上是关于Sqlite数据库使用---基础研究的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite数据库使用---基础研究

Sqlite数据库使用---基础研究

使用片段从数据库 SQLite 获取数据时出错

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

如何在片段中访问 SQLite 数据到 ListView