了解SQLite数据库

2019-08-28  本文已影响0人  CoderShang

Android对数据库的使用是很重要的操作,由此开始系统的学习吧~

目录

1 SQLite是什么

SQLite 是一个进程内的库,不需要在系统中配置。通过静态或动态连接,使其直接访问存储的文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KB,省略可选功能配置时小于250KiB。
SQLite(关系型数据库) 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。

与之进行交互的命令类似于 SQL,命令包括:

2 使用(需要Root❗️)

2.1 安装

客户端开发无需安装SQLite,如要安装在电脑上请参考Windows & Mac 安装
Android手机和7.0以上的模拟器是没root权限的!本文使用的是6.0模拟器,默认root。

2.2 使用SQLite命令

⚠️注意:# 符号表示已经root了,如果是 $ 美元符号,则说明没有root,不可以使用sqlite命令!建议使用6.0的Android模拟器❗️
由于不知道文章编辑器怎么转义,以下所有 # 被我替换成了 >
shell进去后键入一个简单的sqlite3命令,即可进入数据库模式:

$ adb shell
root@generic_x86_64:/ > sqlite3
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

.help命令获取帮助 :

sqlite>.help

部分 SQLite 命令如下:

命令 描述
.backup ?DB? FILE 备份 DB 数据库(默认是 "main")到 FILE 文件。
.databases 列出数据库的名称及其所依附的文件。
.exit 退出 SQLite 提示符。
.help 显示消息。
.echo ON/OFF 开启或关闭 echo 命令。
.header(s) ON/OFF 开启或关闭头部显示。
.import FILE TABLE 导入来自 FILE 文件的数据到 TABLE 表中。
.load FILE ?ENTRY? 加载一个扩展库。
.nullvalue STRING 在 NULL 值的地方输出 STRING 字符串。
.output FILENAME 发送输出到 FILENAME 文件。
.output stdout 发送输出到屏幕。
.stats ON/OFF 开启或关闭统计。
.quit 退出 SQLite 提示符。
.read FILENAME 执行 FILENAME 文件中的 SQL。
.show 显示各种设置的当前值。
.timeout MS 尝试打开锁定的表 MS 毫秒。
.width NUM NUM 为 "column" 模式设置列宽度。
.timer ON/OFF 开启或关闭 CPU 定时器。

让我们尝试使用.show命令,来查看 SQLite 命令提示符的默认设置:

sqlite>.show
        echo: off
         eqp: off
     explain: auto
     headers: off
        mode: list
   nullvalue: ""
      output: stdout
colseparator: "|"
rowseparator: "\n"
       stats: off
       width: 
    filename: :memory:
sqlite> 

确保sqlite>提示符与点命令之间没有空格,否则将无法正常工作。

使用下列的命令配置 (后面查询的时候更好看一些):

sqlite>.header on
sqlite>.mode column
sqlite>.timer on
sqlite>

为了便于学习,我们在/data目录下创建test文件夹,然后创建名为DBtest.db的数据库文件(>后面是shell命令):

$ adb shell
root@generic_x86_64:/data > mkdir test    
root@generic_x86_64:/data > cd test/                                           
root@generic_x86_64:/data/test > sqlite3 DBtest.db                             
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite> 

使用sqlite3 DBtest.db命令,进入一个数据库。
sqlite_master表存储了数据库所有表的关键信息,我们可以查询此表的概要(由于刚创建完数据库,此表中还无任何数据):

sqlite>.schema sqlite_master
CREATE TABLE sqlite_master (
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

现在,我们创建了SQLite数据库,.databases命令来检查它是否在数据库列表中,如下所示:

sqlite>.databases        
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /data/test/DBtest.db                                      
sqlite>

我们能看到这是个列表,就是说还会有其他数据库在里面,其实SQLite还可以创建此库的其他关联库,如:

导出数据库:使用.dump命令将数据库完整的导出到一个文本文件中:

root@generic_x86_64:/data/test > sqlite3 testDB.db .dump > testDB.sql
root@generic_x86_64:/data/test > ls
DBtest.db
DBtest.sql
root@generic_x86_64:/data/test > 

我们也可以从一个文件恢复一个数据库:

sqlite3 testDB.db < testDB.sql

sqlite>表示所处于数据库中,如果想出去,可以使用.quit.exit 命令退出 sqlite 提示符

sqlite>.quit

3 SQLite语句

3.1 SQLite数据类型

在学习SQLite语句之前,必须先要清楚每个存储在 SQLite 数据库中的值的类型:

存储类 描述
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

注:SQLite 亲和类型 我们暂时先不学习。
Boolean 数据类型
SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。
Date 与 Time 数据类型
SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值:

存储类 日期格式
TEXT 格式为 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。
REAL 从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。
INTEGER 从 1970-01-01 00:00:00 UTC 算起的秒数。

我们可以通过上述任一格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。

3.2 SQLite语句

SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 就有不同的含义。
所有的 SQLite 语句可以以任何关键字开始,如SELECTINSERTUPDATEDELETEALTERDROP等,必须以分号;结束。

⚠️注意,由于sqlit>提示符下不支持Tab键,不支持箭头,要谨慎些,若漏掉;分号就执行了,会提示补齐命令:...>在其后面继续敲就好了

3.2.1 创建表

现在,让我们创建一个表(COMPANY公司):

// COMPANY表,ID 作为主键(PRIMARY KEY),NOT NULL约束表示在表中创建纪录时这些字段不能为 NULL
sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
); 
// 复制进去,末尾若出现...> 符号不要慌,按下Enter执行就好

使用.tables查看是否创建成功:

sqlite>.tables
COMPANY

可以使用.schema 表名命令得到表的完整信息,如下所示:

sqlite>.schema COMPANY
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

删除表也很简单:

sqlite> DROP TABLE COMPANY;
3.2.2 添加数据

INSERT INTO 语句有两种基本语法(下面的语句将在 COMPANY 表中创建六个记录):

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );

或:

INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );

使用一个表来填充另一个表:
可以通过在一个有一组字段的表上使用 select 语句,填充数据到另一个表中:

INSERT INTO first_table_name [(column1, column2, ... columnN)] 
   SELECT column1, column2, ...columnN 
   FROM second_table_name
   [WHERE 查询条件];
3.2.3 SELECT查询

我们可以查询一下表数据 如果没有配置如下格式化设置,可以设置一下:

sqlite> .header on
sqlite> .mode column
sqlite> .timer on            
sqlite> SELECT * FROM COMPANY;
ID          NAME        AGE         ADDRESS     SALARY    
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0   
2           Allen       25          Texas       15000.0   
3           Teddy       23          Norway      20000.0   
4           Mark        25          Rich-Mond   65000.0   
5           David       27          Texas       85000.0   
6           Kim         22          South-Hall  45000.0   
Run Time: real 0.001 user 0.000000 sys 0.000000

格式化查询必须在每个库里面单独配置

只想获取 COMPANY 表中指定的字段,则使用下面的查询:

sqlite> SELECT ID, NAME, SALARY FROM COMPANY;

本文只介绍SQLite命令和简单sql语句,有关 详细SQL语句请点击查看

4. Android使用SQLite

有个Demo还没做完,持续更新中,可供参考一个基于SQLite实现的待办App

上一篇下一篇

猜你喜欢

热点阅读