ModelSqlite 2.0.x
基本思想依然是,使用注解完成表与class,列与field的对应关系,通过创建中间模型拼接最终语句。
主要修改:
- 改用kotlin语言;
- 增加了预备的列的个数,即增加了ColumnEnum值;
- 对应关系改为枚举类SQLiteRelevance;
- 修改了sql语句的拼接方式,改用void execSQL(String sql)方法执行语句;
- 增加了动态代理配合注解使用的模式(原理同retorfit);
- 仿照gson添加了对部分对象创建和转换;
如何使用:
一、使用前的准备:
- 使用前必须传入Application上下文为默认的数据库创建上下文,可使用SqlUtil的initConfig方法或者SQLiteConfig的initConfig方法;
- 使用SqlUtil的setJsonUtil方法,添加json与对象间转换的接口ISqlJsonUtil(该步骤可选,仅能添加一个);
- 使用SqlUtil的addTypeCreator方法,添加创建对象实例的接口ObjCreator(该步骤可选,可添加多个);
SqlUtil.initConfig(getApplication(), "LOG_TAG", null);
SqlUtil.setJsonUtil(new ISqlJsonUtil() {
@Override
public <T> T fromJson(String json, @NonNull Type type) {
return gson.fromJson(json, type);
}
@NonNull
@Override
public String toJsonString(Object obj) {
return gson.toJson(obj);
}
});
final ConstructorConstructor constructor = new ConstructorConstructor(
Collections.<Type, InstanceCreator<?>>emptyMap());
SqlUtil.addTypeCreator(new ObjCreator<Object>() {
@Override
public Object create(@NonNull Type t) {
ObjectConstructor objectConstructor = constructor.get(TypeToken.get(t));
if (objectConstructor != null) {
return objectConstructor.construct();
}
return null;
}
});
上述代码均依赖Gson 2.8.4实现
二、使用模型创建
使用方式同1.0版本类似
- 创建主要模型SQLiteInfo,内部包含步长,排序规则,分组规则,查询条件,更改内容,事务开关等;
- 按需条件对应条件信息;
- 使用SqlUtil的getDao方法获取CacheDao单例,CacheDao是默认提供的ISqlDao接口实现,包含大多常用方法:
interface ISqlDao {
fun isDbOpen(): Boolean
fun closeDB()
fun totalCount(): Long
fun saveValue(value: Any): Int
fun saveValue(value: Any, whereClause: SQLiteInfo?): Int
fun saveByArray(valueArray: Map<Any, SQLiteInfo?>): Boolean
fun updateValue(info: SQLiteInfo): Boolean
fun insertValue(info: SQLiteInfo): Boolean
fun delete(info: SQLiteInfo): Boolean
fun deleteByArray(infoList: List<SQLiteInfo>): Boolean
fun queryCursor(info: SQLiteInfo): Cursor
fun getColumnValue(column: ColumnEnum, info: SQLiteInfo): Any?
fun <T> queryFirst(type: Type, info: SQLiteInfo): T?
fun <T> queryArray(type: Type, info: SQLiteInfo): List<T>
fun execSqlString(sqlString: String, openTransaction: Boolean): Boolean
fun execSqlArray(sqlStringArray: List<String>, openTransaction: Boolean): Boolean
}
三、使用接口动态代理
- 创建接口文件,添加方法和注解;
public interface SqlApi {
@DELETE(table = AppConfig.TB_STUDENT)
boolean deleteStudent(@Where(column = ColumnEnum.COLUMN_INT_001) int id);
@SAVE(table = AppConfig.TB_STUDENT)
int saveStudent(@DataBody Student student, @Where(column = ColumnEnum.COLUMN_INT_001) int id);
}
- 使用SqlRetrofit的create方法创建实例;
- 通过实例调用方法。
新增的接口动态代理模式仿照retrofit,使用方式与其类似。目前可用注解一共分为两类:1. 表明执行sql方法的注解,位于com.zpf.modelsqlite.anno.operation包下;2. 添加sql执行条件的注解,位于com.zpf.modelsqlite.anno.additional包下。需要注意的是,不同的注解对返回值或属性值类型有一定限制。
operation注解:
- @DELETE:执行删除语句,支持返回int,boolean,void以及对应包装类;
- @ORIGINAL:执行其属性sqlString定义的语句,支持返回int,boolean,void以及对应包装类,可与@Replace配合动态修改语句;
- @QUERY:执行查询语句,支持返回GenericArrayType,Array,Set,List,Queue及非集合数组类型的对象,暂不支持Map和基本类型及对应包装类;
- @SAVE:若无查询条件,则执行插入语句,否则先按条件查找,找不到则执行插入,找得到执行更行,支持返回int,boolean,void以及对应包装类;
- @UPDATE:执行列更新语句,应与@Value配合使用,支持返回int,boolean,void以及对应包装类;
additional注解:
- @DataBody:仅在@SAVE条件下生效,声明要保存的对象;
- @GROUP:启用分组条件,仅在@QUERY条件下,声明分组依赖的列;
- @Havinng:分组条件,需要在@GROUP生效的条件下生效,声明条件语句;
- @ORDER:启用排序条件,仅在@QUERY条件下,声明排序依赖的列;
- @Page:分页查询,仅在@QUERY条件下,要求属性类型为数字类型;
- @Replace:替换@ORIGINAL中由"{}"包裹的部分字段(类似retorfit@Path);
- @Value:在@SAVE及@UPDATE条件下生效,声明更新或插入的列的值
- @Where::在@DELETE、@QUERY、@SAVE、@UPDATE条件下生效,声明条件语句;
目前条件语句暂不支持使用function(sqlFunc);ignoreOnNull属性为true且对应修饰的属性值为null时,候将会忽略此条件语句;useAndConnector默认为true,表示与上一条件用“AND”连接,否则将使用“OR”连接。
ModelSqlite:1.0.0文章地址 https://www.jianshu.com/p/61ac1be18b97
2020-03-15

浙公网安备 33010602011771号