ModelSqlite 2.0.x

基本思想依然是,使用注解完成表与class,列与field的对应关系,通过创建中间模型拼接最终语句。
主要修改:

  1. 改用kotlin语言;
  2. 增加了预备的列的个数,即增加了ColumnEnum值;
  3. 对应关系改为枚举类SQLiteRelevance;
  4. 修改了sql语句的拼接方式,改用void execSQL(String sql)方法执行语句;
  5. 增加了动态代理配合注解使用的模式(原理同retorfit);
  6. 仿照gson添加了对部分对象创建和转换;

如何使用:
一、使用前的准备:

  1. 使用前必须传入Application上下文为默认的数据库创建上下文,可使用SqlUtil的initConfig方法或者SQLiteConfig的initConfig方法;
  2. 使用SqlUtil的setJsonUtil方法,添加json与对象间转换的接口ISqlJsonUtil(该步骤可选,仅能添加一个);
  3. 使用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版本类似

  1. 创建主要模型SQLiteInfo,内部包含步长,排序规则,分组规则,查询条件,更改内容,事务开关等;
  2. 按需条件对应条件信息;
  3. 使用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
}

三、使用接口动态代理

  1. 创建接口文件,添加方法和注解;
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);
}
  1. 使用SqlRetrofit的create方法创建实例;
  2. 通过实例调用方法。

新增的接口动态代理模式仿照retrofit,使用方式与其类似。目前可用注解一共分为两类:1. 表明执行sql方法的注解,位于com.zpf.modelsqlite.anno.operation包下;2. 添加sql执行条件的注解,位于com.zpf.modelsqlite.anno.additional包下。需要注意的是,不同的注解对返回值或属性值类型有一定限制。
operation注解:

  1. @DELETE:执行删除语句,支持返回int,boolean,void以及对应包装类;
  2. @ORIGINAL:执行其属性sqlString定义的语句,支持返回int,boolean,void以及对应包装类,可与@Replace配合动态修改语句;
  3. @QUERY:执行查询语句,支持返回GenericArrayType,Array,Set,List,Queue及非集合数组类型的对象,暂不支持Map和基本类型及对应包装类;
  4. @SAVE:若无查询条件,则执行插入语句,否则先按条件查找,找不到则执行插入,找得到执行更行,支持返回int,boolean,void以及对应包装类;
  5. @UPDATE:执行列更新语句,应与@Value配合使用,支持返回int,boolean,void以及对应包装类;

additional注解:

  1. @DataBody:仅在@SAVE条件下生效,声明要保存的对象;
  2. @GROUP:启用分组条件,仅在@QUERY条件下,声明分组依赖的列;
  3. @Havinng:分组条件,需要在@GROUP生效的条件下生效,声明条件语句;
  4. @ORDER:启用排序条件,仅在@QUERY条件下,声明排序依赖的列;
  5. @Page:分页查询,仅在@QUERY条件下,要求属性类型为数字类型;
  6. @Replace:替换@ORIGINAL中由"{}"包裹的部分字段(类似retorfit@Path);
  7. @Value:在@SAVE及@UPDATE条件下生效,声明更新或插入的列的值
  8. @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

posted @ 2020-10-10 14:52  FirstLetterZ  阅读(115)  评论(0)    收藏  举报