第二个数据库升级方案是基于数据库表的结构都是存储在sqlite_master这个表中,通过修改sqlite_master中的数据来达到修改数据库表结构的作用。步骤描述如下:
开启一个事务
使用命令PRAGMA schema_version获取当前的schema version。
使用命令 PRAGMA writable_schema=ON。使得数据库表结构可以修改。
修改主表(sqlite_master)中相关的数据库表的定义表结构的sql命令。命令类似update sqlite_master set sql='创建数据库表命令' where type='table' AND name='X';。这步的操作属于比较危险的操作,如果操作不当,容易造成数据库不可读,因此要特别注意。
如果表X的重新创建会影响其原本的索引,触发器,视图,则需要使用update 命令进行相应的修改。比如说修改了列的名称,则与这个列相关的索引,触发器,视图,外键约束必须进行相应的修改。
将第二步获得到的schema version 加1,并使用命令PRAGMA schema_version=X,保存到数据库中。
使用命令 PRAGMA writable_schema=OFF。恢复数据库表结构不可修改。
使用 命令PRAGMA integrity_check确保数据库没有被破坏。
提交事物。
后续SQLite支持表结构修改,修改的方案会是以上描述的其中一个。
数据库表示例
数据库表结构
数据库表名:admin。数据库表结构
主键 账号 密码
id username password
创建数据表命令
CREATE TABLE "admin" ("id" INTEGER NOT NULL,"username" VARCHAR(20),"password" VARCHAR(128),PRIMARY KEY("id"));
1
创建索引
CREATE INDEX "ix_admin_username" ON "admin" (
"user_name"
);
1
2
3
创建触发器。触发器的作用是当表Admin有数据修改的时候记录一下,修改时间,作为追溯数据库表修改的日志记录。 表admin_record结构如下
列名 含义
id admin表的主键只
datatime admin表修改的时间
// 创建admin_record
CREATE TABLE "admin_record" ("id" INTEGER NOT NULL,"datatime" VARCHAR(20),PRIMARY KEY("id"));
// 创建索引
CREATE TRIGGER admin_record_trigger AFTER INSERT
ON admin
BEGIN
INSERT INTO admin_record(id, datatime) VALUES (new.id, datetime('now'));
END;
// 测试
// 在admin 表中插入一条数据,则会触发 触发器在 admin_record中也插入一条数据
INSERT INTO admin(id, username,password) VALUES (100,'name100','password100');
1
2
3
4
5
6
7
8
9
10
11
创建视图,在表admin中创建一个视图,视图中只显示表admin的部分列,比如说主键值和账号。命令如下
// 创建视图
CREATE VIEW admin_view AS
SELECT id, username
FROM admin
1
2
3
4
查询表结构
查询表admin的相关索引的命令
SELECT type,sql FROM sqlite_master WHERE tbl_name='admin' AND type='index'
1
查询结果
type index
index CREATE INDEX “ix_admin_username” ON “admin” (“user_name”)
查询admin的触发器
SELECT type,sql FROM sqlite_master WHERE tbl_name='admin' AND type='trigger'
1
查询结果
type sql
trigger CREATE TRIGGER admin_record_trigger AFTER INSERT ON admin BEGIN INSERT INTO admin_record(id, datatime) VALUES (new.id,datetime('now'));END
查询视图
注意查询视图,视图在主表sqlite_master 相当于一个表。不能直接通过指令查询到由某个表创建出来的视图。
SELECT type,sql FROM sqlite_master WHERE type='view'
1
GreenDao 统一数据库升级方案
greenDAO是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到SQLite数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。