本文主要实现如何搭建一套自己的数据库框架。包括数据库的创建、表的创建、数据的增删改查功能、以及数据库如何实现分库、如何进行更新。
一、创建数据库及生成数据库表
如何使自己的数据库表的创建以更加优雅的方式,我们就需要注解的方式实现。
1、创建表名注解类Table
2、创建表中字段注解类FieldParams
3、创建实体类中不需要保存到数据库的字段注解类Exclude
4、创建数据库表实体类Student
针对没有FieldParams注解的字段我们会使用字段名称作为数据库保存的字段名称,对于Exclude注解的字段我们不保存在数据库中。
5、创建数据库操作公共接口IBaseDao
接口提供增删改查基本功能,供子类实现。
这里使用泛型T表示,做到了实体类的通用。
6、创建数据库操作公共实现类BaseDao
这个类主要负责数据库的基础增删改查的操作,对于其他特殊的数据库操作功能,我们可以继承这个类去扩展功能。
(1)创建数据库表
在init方法进行创建表的操作,大致流程是通过反射拿到实体类的数据库表名,和注解的字段名称及类型,将它们拼接处数据库执行语句,最后通过SQLiteDatabase执行execSQL(sql)即可。主要代码如下:
拼接过程如下:
private String createTableSql(Class<T> clazz) {
StringBuilder sb = new StringBuilder();
sb.append("create table if not exists " + tableName + "(");
//拿到所有的属性字段
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
//判断是否需要保存字段到数据库
Exclude exclude = field.getAnnotation(Exclude.class);
if (exclude != null) {
continue;
}
FieldParams fieldParams = field.getAnnotation(FieldParams.class);
//字段名
String columnName;
if (fieldParams == null) {
columnName = field.getName();
} else {
columnName = fieldParams.value();
}
if ("serialVersionUID".equals(columnName)) {
continue;
}
caches.put(columnName, field);
//拼接类型
Class type = field.getType();
if (type == String.class) {
sb.append(columnName + " TEXT,");
} else if (type == Integer.class || type == int.class) {
sb.append(columnName + " INTEGER,");
} else if (type == Long.class) {
sb.append(columnName + " BIGINT,");
} else if (type == Double.class) {
sb.append(columnName + " DOUBLE,");
} else if (type == byte[].class) {
sb.append(columnName + " BLOB,");
} else {
//不支持的类型号
caches.remove(columnName);
continue;
}
}
//去除最后一个,
if (sb.charAt(sb.length() - 1) == ',') {
sb = sb.deleteCharAt(sb.length() - 1);
}
sb.append(")");
return sb.toString();
}
最后执行如下:
(2)创建数据库
创建一个用户可以直接操作的类,类中我们进行数据库的创建
并且提供方法,创建数据库表
这里调用init方法后就完成了数据库表的创建,并将数据库SQLiteDatabase对象传给了BaseDao类,拿到它我们就可以进行增删改查操作了。
二、创建数据库表增删改查
以上完成了数据库的创建和表的创建,并且BaseDao基类持有了SQLiteDatabase对象,下面开始基础功能的实现
1、增
主要执行db.insert()方法。其中第三个参数保存了所有字段及字段值的映射,代码如下:
注意,我这里的caches是一个map集合,key为数据库中字段对应的名称,value为实体类的属性Field
2、查
注意,这里的getFields()方法会返回当前查询条件的map集合,然后创建Conditions类,它包含查询需要的两个字段,注释有说明。
getField()方法如下:
Conditions类代码如下:
3、改
主要执行db.update()方法。
4、删
主要执行db.delete()方法。
以上就完成了数据库基本框架的搭建,提供了基础的四个方法。