SQLite 相关

date
Aug 16, 2021
slug
SQLite
status
Published
tags
Android
summary
type
Post

开发者工具

Mac 下自带 sqlite3 工具,可执行执行 sqlite3 .help 查看相关信息。
$sqlite3 -help //帮助信息

$sqlite3 test.db //打开,若不存在,则创建并打开

sqlite> // 为进入 sqlite 环境
sqlite> .help //等同于 $sqlite3 -help

sqlite> select * from sqlite_master; // 查询所有表

常用配置

sqlite> .show // 查看配置信息

.header on //展示表头
.mode column //展示模式
.width 3 20 10 //列宽,单位字符数

$sqlite3 Kv.db .dump > Kv.sql // 导出数据库到 sql 文件
$sqlite3 Kv.db < Kv.sql // 导入 sql 数据
⚠️
每一条 SQL 语句结束必须带 ;

外键约束

sqlite 默认不开启外键约束,需手动执行命令。
sqlite> PRAGMA foreign_keys = ON;
外键约束需要在创建的时候对某个列指定外键约束的具体情况,也就是 on update on delete 后的枚举值。
共有以下几种
  • NO ACTION 不做任何操作
  • RESTRICT 当子表中有对主表的引用时, 任何对主表中的被引用行的删除、修改都被限制
  • SET NULL 当 update 或 delete 时,设置当前列为 null
  • SET DEFAULT 同 set null,不过不是设置为 null 而是设置为当前列的默认值
  • CASCADE,跟随主表同步修改,主表 update,这里的引用也就 update,主表 delete,当前表中的引用行就会被删除
CREATE TABLE contrace (
	_id integer PRIMARY KEY autoincrement NOT NULL,
	address text NOT NULL,
	phone text NOT NULL,
	user_name text NOT NULL,
	FOREIGN KEY (user_name) REFERENCES user(name) ON UPDATE CASCADE ON DELETE CASCADE
);
后端开发中,一般为避免性能瓶颈,不使用外键。
一对一的查询使用 left join 就能查到相关信息,如果是一对多的话,单独使用 SQL 语句是不行的,需要配合数据库的相关框架才能将一对多表现为一个 Object 包含自己信息的同时含有子元素的列表。比如后端的 Mybatis,Android 端的一些 ORM 框架也能做,纯 SQL 是不行的。
-- 表结构
CREATE TABLE class (
	_id integer PRIMARY KEY autoincrement NOT NULL,
	name text NOT NULL
);

CREATE TABLE student (
	_id integer PRIMARY KEY autoincrement NOT NULL,
	name text NOT NULL,
	age integer NOT NULL,
	class_id integer NOT NULL
);

-- 查询关联信息
SELECT
	student._id,
	student. "name",
	student.age,
	"class"."name"
FROM
	student
	LEFT OUTER JOIN "class" ON student.class_id = "class"._id
WHERE
	"class"._id = 1;
Select from 后面不只是可以跟表名,还可以跟子语句的查询结果。需要注意的是子语句的查询结果必须要有个临时表名,不然没法从临时表中查询数据。
SELECT a.eId,
         LastName
FROM 
    (SELECT EmployeeId AS eId,
         LastName,
         FirstName,
         Address
    FROM employees) a
WHERE a.eId = 1;

插入二进制数据「图片等」

  1. 可以用 SQLite 自带的 blob 数据类型,进行插入。Android 端,ContentValues 可插入,查询时拿到 Cursor 后,也可用过其获取到二进制文件的字节数组。
  1. 使用 base64 编码后再插入,不推荐,因为 base64 会将原数据放大 1/3。
 

Android 开发相关

在不确定 SQL 语句是否可以的情况下,可以把 SQLite 文件导出,然后使用数据库软件或是命令行进入,执行相关语句。也可以使用 Android Studio 自带的 Database Inspector 进行查询。
Database Inspector 可能会出现报红的异常,一般可能是表名写错了,或是关联表查询的时候 join 的表名有问题。
  1. 使用 Count 函数
    1. // select count(*) from resource where status = Success
      val successCount = DatabaseUtils.queryNumEntries(db, "resource", "status = ?", arrayOf("Success"))
 

推荐资源

1. 线上数据库演示实例
  1. SQLite 基础教程
  1. 在线 SQLite 命令行工具
 

© Craig Hart 2021 - 2025