Android对数据库的使用是很重要的操作,由此开始系统的学习吧~
目录
- 1.SQLite是什么
- 2.使用
- 3.SQLite语句
- 4.Android使用SQLite
1 SQLite是什么
SQLite 是一个进程内的库,不需要在系统中配置。通过静态或动态连接,使其直接访问存储的文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KB,省略可选功能配置时小于250KiB。
SQLite(关系型数据库) 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
与之进行交互的命令类似于 SQL,命令包括:
-
CREATE
:创建一个新的表,一个表的视图,或者数据库中的其他对象。 -
ALTER
:修改数据库中的某个已有的数据库对象,比如一个表。 -
SELECT
:从一个或多个表中检索某些记录。 -
INSERT
:创建一条记录。 -
UPDATE
:修改记录。 -
DELETE
:删除记录。 -
DROP
:删除整个表,或者表的视图,或者数据库中的其他对象。
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 语句可以以任何关键字开始,如SELECT
、INSERT
、UPDATE
、DELETE
、ALTER
、DROP
等,必须以分号;
结束。
⚠️注意,由于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
网友评论