数据库在实际的移动开发中使用的频率真的不太多,开发几款小的app基本没有用过数据库,但是你不能说它不重要,一些阅读或者聊天类型的用数据库很频繁,我自己没涉及到这一类型的app开发,趁着有时间重新回顾学习下数据库的知识点,可能写的比较散,想到哪里些哪里,只是关于Android 的数据库的回顾哈~
一、数据库
Android的数据库创建: 继承SQLiteOpenHelper类后的onCreate方法中可以实现数据库创建的操作,但是这里数据库还没有创建完成,只有调用getWritableDatabase() 或 getReadableDatabase() 才算数据库创建完成。说的我自己都有些绕~
建表:create table tableName
(_id integer primary key autoincrement,
字段1 数据类型,
字段2 数据类型,
...
)
数据类型 data_type ,SQL中最常用的是以下几种类型:
- 仅仅容纳整数,括号内规定的数字是字段的最大位数,可以不写。 integer(size) 、 int(size)、smallint(size)、tinyint(size)。
- 容纳带小数的数字。”size“ 数字的最大位数,”d“ 小数点右侧的最大位数。 decimal(size,d)、numeric(size,d)
- 容纳固定长度的字符串。 char(size)
- 容纳可变长度的字符。 varchar(size)
- 容纳日期。 date(yyyymmdd)
二、SQL语句
@ sql 语句对大小写不敏感。sql 分为两部分:DML 和 DDL 。DML(数据操作语言)—— 增(insert)删(delete)改(update)查(select) , DDL(数据定义语言)—— 创建(create)修改(alter)或删除(drop)表格、创建或修改数据库、创建或删除索引等
1、DML
1)、select 查
select 列名称 from 表名称(查询表中莫一字段数据)
select * from tableName (查询表中所有字段)
select 字段1,字段2,... from tableName (查询表中某几个字段)
select distinct 字段 from tableName (查询表中莫一字段并且剔除重复数据有且只展示一次的数据)
select 字段 from tableName where 字段 运算符 值 and(or) 字段 运算符 值 (条件查询表中的莫一字段数据)
select * from tableName order by 字段 asc(desc) —— (查询字段并排序)
2)、insert 增
insert into tableName values(值1,值2,...) —— (插入一列数据到表中)
insert into tableName(字段1,字段2,...) values(值1,值2,...) —— (插入一列包含某些字段的数据到表中)
3)、 update 改
update tableName set 字段1 = 新值1,字段2 = 新值2... where 字段 = 某值 —— (修改莫一字段下符合莫一条件的数据)
4)、 delete 删
delete from tableName where 字段 = 值 —— (删除莫一条件下的行)
delete from tableName 或 delete * from tableName —— (不删除表的情况下删除所有的行)
2、DDL
1)、数据库
create database databaseName —— (创建数据库)
drop database databaseName —— (删除数据库)
SQLite 中创建和删除数据库的功能有所限制,Android中可以在SQLiteOpenHelper中创建数据库。
2)、表
create table tableName(字段1 数据类型, 字段2 数据类型, ... ) —— (创建数据库种的表)
drop table tableName —— (删除表)
alter table tableName
add columnName datatype —— (在表中添加列)
alter table tableName
drop column columnName (或者 alter column columnName datatype) —— 删除表中的列,有些数据库不允许使用第一种方法,就需要用第二种方式 (SQLite 中暂时无法删除列)
@ SQLite 中alter table 功能有所限制,只能添加和重命名列,不能修改和删除列。
3)、索引
create index indexName on tableName(columnName) —— 创建索引,columnName 规定需要索引的列
create unique index indexName on tableName(columnName) —— 表中创建唯一的索引。唯一意味着两个行不能拥有相同的索引值。
三、Android 中数据库增删改查的操作
1、创建数据库:
SQLiteOpenHelper 的子类的构造方法 : 调用父类构造方法super()创建数据库;
public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version); 其中 name 表示数据库文件名,version 数据库版本号。
onCreate() :数据库首次被创建的时候会调用这个方法,是创建数据库表、视图等组件和表初始化的地方。
- 在第一次打开数据库的时候才会运行
- 在清除数据后再次运行,打开数据库还是会运行
- 升级数据库不会运行这个方法,运行onUpgrade()方法
onUpgrade() :数据库本身存在,并且当前数据库版本号高于上次创建或升级的版本号,调用这个方法,会重新更新数据库的版本号。在这个方法中除了创建表、视图等组件外,还需要先删除这些相关组件。
public class DBHelper extends SQLiteOpenHelper {
public final static String DB_NAME = "fava_database.db";
public final static int DB_VERSIONCODE = 1;
public final static String TABLE_NAME = "shb";
/**
* 需要添加到表里的字段
*/
public final static String CITY_NAME = "cityName"; //城市名
public final static String ROOM_TITLE = "roomTitle";//房源名
public final static String PRICE = "price";//房源价格
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSIONCODE);
}
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
/**
* 创建一个数据库
* 当数据库文件创建时,执行初始化操作,并且只执行一次
*
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//建表
String sql = "create table "
+ TABLE_NAME + " (_id integer primary key autoincrement, "
+ CITY_NAME + " varchar, "
+ ROOM_TITLE + " text, "
+ PRICE + " varchar)";
db.execSQL(sql);
}
/**
* 升级数据库
* 当数据库版本更新执行该方法
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/**
* 降级数据库版本
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
}
2、SQLite 存储:
(1)存储的数据类型
- NULL 值是null。
- INTEGER 值是带符号的整数,根据值的大小存储在1、2、3、4、6、8字节中,对应Java中的byte、short 、int 、long。
- REAL 值是浮点值, 存储为8字节的IEEE浮点数字(单精度、双精度等),对应Java中的float、double。
- TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,对应Java中 String。
- BLOB 值是blob数据(可以存储二进制文件的容器),完全根据它的输入存储。
数据类型转换:
1)、INTEGER
tinyint 小整数型,1字节。
smallint 大整数型,2字节。
mediumint 大整数型,3字节。
int 整型,一般存储在4字节中,默认是0。
integer 整型包装类,4字节,32位元的整数,默认是null。
bigint 极大整数型,8字节。
2)、TEXT
char 保存固定长度的字符串,最多255个字符。
varchar 保存可变长度的字符串,最多255个字符,如果值长度超过255,则被转换为TEXT类型。
tinytext 存放最大长度为255个字符的字符串。
text 存放最大长度为 65 635 个字符的字符串。
blob 用于BLOBs , 存放最多 65 535 字节数据。
mediumtext 存放最大长度 16 777 215 个字符的字符串。
mediumblob
longtext 存放 4 294 9677 295 个字符的字符串。
longblob
enum(x,y,z,etc.) 允许你输入可能值的列表。
set 与enum类似,set最多只能包含64个列表项,不过set可以存储一个以上的值。
3)、DATE(SQLite 没有单独的日期时间数据类型,可以转换为INTEGER 或 TEXT类型进行存储)
date() 日期 , 格式 yyyy-mm-dd。
datetime() 日期和时间, 格式yyyy-mm-dd hh:mm:ss。
timestamp() 时间戳, 格式 yyyy-mm-dd hh:mm:ss 或 yyyymmddhhmmss 或 yymmddhhmmss 或 yyyymmdd 或 yymmdd。
time() 时间, 格式hh:mm:ss。
year() 年, 格式 yyyy 或者 yy。
4)、NUMBER
INTEGER
float 带有浮动小数点的小数字。
double 带有浮动小数点的大数字。
decimal 作为字符串存储的double类型,允许固定的小数点。
SQLite 没有单独的Boolean存储类,布尔值被存储为整数0 (false) 和 1(true) 。
(2)常用约束条件
3、数据库中存储数据
public class DBOption {
private final DBHelper dbHelper;
private final SQLiteDatabase dbDataBase;
public DBOption(Context context) {
dbHelper = new DBHelper(context);
dbDataBase = dbHelper.getWritableDatabase();
}
/**
* 插入数据
*
* @param name 插入的城市名
* @param roomTitle 插入的房源名称
* @param price 插入的房源价格
*/
public void inserData(String name, String roomTitle, String price) {
ContentValues contentValues = new ContentValues();
contentValues.put(DBHelper.CITY_NAME, name);
contentValues.put(DBHelper.ROOM_TITLE, roomTitle);
contentValues.put(DBHelper.PRICE, price);
dbDataBase.insert(DBHelper.TABLE_NAME, null, contentValues);
}
/**
* 删除整个城市的数据
*
* @param oldName 删除条件字段值
* @param name 删除的城市名
*/
public int deleteCityData(String name, String oldName) {
int delete = dbDataBase.delete(DBHelper.TABLE_NAME, DBHelper.CITY_NAME + " = ? ", new String[]{oldName});
return delete;
}
/**
* 刪除价格过滤后的房源数据
*
* @param oldPrice 删除的条件字段值
* @return
*/
public int deletePrcieData(String oldPrice) {
int delete = dbDataBase.delete(DBHelper.TABLE_NAME, DBHelper.PRICE + " > ?", new String[]{oldPrice});
return delete;
}
/**
* 更新房源信息Z
*
* @param roomTitle
* @param cityName
* @param price
*/
public void updateData(String roomTitle, String cityName, String price) {
ContentValues value = new ContentValues();
value.put(DBHelper.CITY_NAME, cityName);
value.put(DBHelper.PRICE, price);
value.put(DBHelper.ROOM_TITLE, roomTitle);
dbDataBase.update(DBHelper.TABLE_NAME, value, DBHelper.ROOM_TITLE + " = ?", new String[]{"小清新单间"});
}
/**
* 查询数据库数据
*
* @param oldPrice 需要筛选的条件值
*/
public ArrayList<RoomBean> queryData(String oldPrice) {
Cursor cursor = dbDataBase.query(DBHelper.TABLE_NAME, new String[]{dbHelper.CITY_NAME, dbHelper.ROOM_TITLE, dbHelper.PRICE},
DBHelper.PRICE + " > ?", new String[]{oldPrice}, null, null, DBHelper.PRICE + " asc");
int cityIndex = cursor.getColumnIndex(DBHelper.CITY_NAME);
int priceIndex = cursor.getColumnIndex(DBHelper.PRICE);
int roomIndex = cursor.getColumnIndex(DBHelper.ROOM_TITLE);
ArrayList<RoomBean> bean = new ArrayList<>();
while (cursor.moveToNext()) {
String city = cursor.getString(cityIndex);
String price = cursor.getString(priceIndex);
String roomTitle = cursor.getString(roomIndex);
RoomBean dd = new RoomBean(city, roomTitle, price);
bean.add(dd);
}
return bean;
}
/**
* 信息类bean
*/
class RoomBean implements Serializable {
private String cityName;
private String roomTitle;
private String price;
public RoomBean(String cityName, String roomTitle, String price) {
this.cityName = cityName;
this.roomTitle = roomTitle;
this.price = price;
}
}
}
四、SQLite 基本介绍
SQLite 数据库采用模块化涉及,由8个独立的模块组成,这些独立的模块又构成3个主要子系统,模块将复杂的数据库操作过程分解为细小的工作来进行处理。这些模块被分割成两部分,分别是:前端解析系统和后端引擎。
(一)、前端解析系统
负责处理传递过来的SQL语句和SQLite命令,对获取的编码分析、优化并转为后端可以执行的SQLite内部字节码。
1、词法分析器(Tokenizer)
把传递过来包含SQL的字符串分割成一个个标识符,并把标识符传递给解析器。
2、语法分析器(Parser)
在指定的上下文中赋予标识符具体的含义。
3、代码生成器(Code Generator)
Parser把标识符组装成完整的SQL语句后,就调用Code Generator 产生虚拟机代码,以执行SQL语句请求工作。
(二)、SQLite 后端引擎
后端是用来解释字节编码程序的引擎,该引擎才是真正数据库处理工作。
1、虚拟机(VM)
通过执行字节编码语句实现SQL语句的工作。它是数据库中数据的最终操作者,它把数据库堪称表和索引的集合,而表和索引则是一系列的元组或者记录。
2、B/B+树
帮助VM进行搜索,插入和删除树中的元组,也帮助VM创建新的树和删除旧的树。
3、页面调度程序(pager)
管理B/B+树使用的内存内缓存(数据库页的),也管理文件的锁定。