Android SQLite 入门

是2000年推出的基于C语言开发的跨平台数据库.

SQLite遵守ACID,实现了大多数SQL标准。它使用动态的、弱类型的SQL语法。[4]它作为嵌入式数据库,是应用程序,如网页浏览器,在本地/客户端存储数据的常见选择。它可能是最广泛部署的数据库引擎.

特点

  1. 体积非常小高性能的数据库
  2. 无需服务器等额外配置
  3. 动态类型数据库, 无论给任何类型都会当作字符串(非varchar或char类型, 是TEXT类型)存储, 长度是可变不限定的. 所以在创建数据表时所指定的类型和长度只是给开发者自己看的.
  4. 开源
  5. 跨平台跨语言

数据库分类

SQL命令

数据库中可以有多个数据表, 数据表中有多条记录(一条记录就是一行). 记录包括多个字段(相同字段就是一列). 一个数据库就相当于一张EXEL表格一样.

SQL命令语法不区分大小写

SQL标准语言是很多数据库操作的通用语言, 分为以下三类;

DDL - 数据定义语言

CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。

DML - 数据操作语言

命令 描述
INSERT 创建一条记录。
UPDATE 修改记录。
DELETE 删除记录。
INSERT
1
insert into
DELETE
lite
1
2
delete from table_name; // 删除整个表单
delete from table_name where id = 2; // 删除表单中id为2的记录

DQL - 数据查询语言

命令 描述
SELECT 从一个或多个表中检索某些记录。

条件

WHERE

给数据库命令加一个条件限定

1
delete from table_name where id = 2; // 删除当字段id为2的记录

LIKE字段匹配运算符, LIKE有两个通配符”_”和”%”

1
delete from table_name where id like "2%"; // 表示删除id为2开头的记录

下面一些实例演示了 带有 ‘%’ 和 ‘_’ 运算符的 LIKE 子句不同的地方:

语句 描述
WHERE SALARY LIKE ‘200%’ 查找以 200 开头的任意值
WHERE SALARY LIKE ‘%200%’ 查找任意位置包含 200 的任意值
WHERE SALARY LIKE ‘_00%’ 查找第二位和第三位为 00 的任意值
WHERE SALARY LIKE ‘2%%’ 查找以 2 开头,且长度至少为 3 个字符的任意值
WHERE SALARY LIKE ‘%2’ 查找以 2 结尾的任意值
WHERE SALARY LIKE ‘_2%3’ 查找第二位为 2,且以 3 结尾的任意值
WHERE SALARY LIKE ‘2___3’ 查找长度为 5 位数,且以 2 开头以 3 结尾的任意值

可以看出两者都表示是任意字符的占位符, 区别是”%”表示至少是一个占位字符, “_”表示只能是一个占位字符.可以理解为”X+”和”X”的区别

除此之外还有andor 运算符, 其相当于java中的 & 和 | ,用于连接两个不同的条件

1
DELETE FROM tableName WHERE _id = 1 OR password = 321; // 删除id为1或者password为2的记录

Android SQLite

创建数据库

android中需要通过继承SQLiteOpenHelper来创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class BankSqliteHelper extends SQLiteOpenHelper {
/**
* 数据库
* <p>
* 此处的null 是数据库的游标工厂, Google文档解释为在查询query执行后用来返回一个游标Cursor对象, 默认为null
*
* @param context 上下文
* @param databaseName 创建的数据库名
* @param version 创建的数据库版本号
*/
public DatabaseOpenHelper(Context context, String databaseName, int version) {
// 访问父类有参构造方法
super(context, databaseName, null, version);
}
/**
* 数据库第一次创建执行, 如果已经存在同名数据库文件将不会再次创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 创建数据表
db.execSQL("create table account ( _id integer primary key autoincrement, name varchar(0)" +
", " +
"money varchar(0))");
}
}

然后需要执行方法getWriteableDatabase()创建数据库,如果需要创建多个数据库需要创建多个SQLiteOpenHelper对象

1
2
3
4
5
BankSqliteHelper sqliteHelper = new BankSqliteHelper(getContext());
// 创建可读可写数据库
SQLiteDatabase database = sqliteHelper.getWritableDatabase();
// SQLiteDatabase是数据库访问对象
database.insert("account", null, values);

升级数据库

数据库的版本号只能升级不能降级. 当版本号大于之前的数据库版本号时,就会执行SQLiteOpenHelper实现类的onUpgrade()方法

1
2
3
4
5
6
7
8
9
10
/**
* 数据库升级执行
* @param db 数据库访问对象
* @param oldVersion 旧版本号
* @param newVersion 新版本号
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 在这里我们根据程序的旧版本号来区分如何升级数据库的数据
}

操作数据库

操作数据库可以使用ORM框架或者android自带的SQLiteDatabase数据访问对象. SQLiteDatabase支持标准的SQL语言和已经封装好的方法对数据库进行操作.

通过标准的SQL语言操作数据库
  • rawQuery() 查询语句, 返回值为Cursor游标集
  • execSQL() 任意操作语句, 没有返回值所以无法直接得到数据库操作结果
通过android封装方法操作数据库

insert() 插入

delete() 删除

update() 修改

query() 查询

事务

数据库中某些操作要求同步执行, 例如一个user字段值被修改后要求他的id字段值也同时发生变化, 如果依次去执行, 在修改user后如果发生程序异常终止时后续对id修改将不会执行到. 这个时候就需要事务

1
2
3
4
mDatabase.beginTransaction(); // 开启事务
mDatabase.execSQL("alter table tableName add money varchar(1)");
mDatabase.setTransactionSuccessful(); // 设置事务成功
mDatabase.endTransaction(); // 如果事务成功被执行, 则提交到数据库, 否则不提交

beginTransaction()endTransaction()中间的任何数据库操作都只会同步执行

约束

primary_key 数据库主键, 标示字段的唯一和不能为空属性. 同时是一个特殊的索引, 可以增加数据库查询速度,相当于目录可以不需要全表扫描