微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlite 数据库更新

本次更新测试基于反射和注解:暂时不允许主键的更改

 @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {

        try {
            List<Class<?>> list = new ArrayList<>();
            TableScaner.scan(mContext,IConfig.tablePackageName,list);//扫描beans包下的类
            for(Class clazz : list){
                if(clazz.isAnnotationPresent(Table.class) && clazz.isAnnotationPresent(TabLeversion.class)){//是表才操作
                    TabLeversion tabLeversion = (TabLeversion) clazz.getAnnotation(TabLeversion.class);
                    boolean newTable = false;
                    if(tabLeversion.newTableCode() > oldVersion){//新增版本大于旧版本,保证先有表
                        db.execsql(DBTools.getCreatesql(clazz));
                        newTable = true;
                    }

                    if(tabLeversion.modifyTableCode() > tabLeversion.newTableCode()){//修改版本大于新增版本
                        Field[] fields = clazz.getDeclaredFields();
                        for(Field field : fields){
                            FieldVersion fieldVersion = field.getAnnotation(FieldVersion.class);
                            if(fieldVersion.newColumnCode() > tabLeversion.newTableCode()){//新增列
                                if(!newTable){//如果刚执行了新建表true,表明用户跨版本升级,则这里不再操作新增
                                    try {
                                        String sqlString = "ALTER TABLE " + DBTools.getTableName(clazz)+" ADD COLUMN "+ field.getName()+ getColumnType(field);
                                        db.execsql(sqlString);
                                    }catch (Exception e){//已经存在该列
                                        Log.d("hjh",e.getMessage());
                                    }
                                }
                            }

                            if(fieldVersion.deleteColumnCode() > fieldVersion.newColumnCode()){//删除版本必然大于新增版本
//                                db.execsql("insert into "+DBTools.getTableName(clazz)+" (test,userid) values("+System.currentTimeMillis()+",1)");
//                                db.execsql("insert into "+DBTools.getTableName(clazz)+" (test,2)");//测试
                                db.execsql("ALTER TABLE " + DBTools.getTableName(clazz)+" RENAME TO "+ "app_temp_table");//将原表重命名
                                db.execsql(createsqlExceptDelete(clazz));//重新创建
                                db.execsql("INSERT INTO " + DBTools.getTableName(clazz) + " SELECT "+getAllColumnsExceptDelete(clazz.getDeclaredFields())+" FROM app_temp_table");//插入数据
                                db.execsql("DROP TABLE app_temp_table");//删除临时表
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printstacktrace();
            Log.d("hjh",e.getMessage());
        }

    }

   
    //减少字段查找时使用
    private String getAllColumnsExceptDelete(Field[] fields){
        String content = "";
        List<Field> list = new ArrayList<>();
        for(Field field : fields){
            field.setAccessible(true);
            if(field.isAnnotationPresent(ColumnInt.class) || field.isAnnotationPresent(ColumnText.class) ||
                    field.isAnnotationPresent(ColumnFloat.class) || field.isAnnotationPresent(ColumnDouble.class)||
                    field.isAnnotationPresent(ColumnString.class)|| field.isAnnotationPresent(ColumnDate.class) ||
                    field.isAnnotationPresent(ColumnBinary.class) || field.isAnnotationPresent(ColumnLong.class)||
                    field.isAnnotationPresent(ColumnBoolean.class)){
                if(field.isAnnotationPresent(FieldVersion.class)){
                    FieldVersion fieldVersion = field.getAnnotation(FieldVersion.class);
                    if(fieldVersion.deleteColumnCode() > fieldVersion.newColumnCode()) {
                        continue;//排除删除字段
                    }else {
                        list.add(field);
                    }
                }
            }
        }

        for(int index = 0; index < list.size();index ++){
            if(index != list.size() -1){//非最后一个
                content += list.get(index).getName()+",";
            }else {
                content += list.get(index).getName();
            }
        }

        return content;
    }

    //增加字段时使用
    private String getColumnType(Field field){
        field.setAccessible(true);
        String content = "";
        if(field.isAnnotationPresent(ColumnInt.class) && !field.isAnnotationPresent(ColumnPrimaryKey.class)) {
            content = " integer";
        } else if(field.isAnnotationPresent(ColumnText.class)) {
            content = " text";
        } else if(field.isAnnotationPresent(ColumnFloat.class)) {
            content = " float";
        } else if(field.isAnnotationPresent(ColumnDouble.class)) {
            content = " double";
        } else if(field.isAnnotationPresent(ColumnString.class)) {
            content = " varchar(" + ((ColumnString)ColumnString.class.cast(field.getAnnotation(ColumnString.class))).length() + ")";
        } else if(field.isAnnotationPresent(ColumnDate.class)) {
            content = " date";
        } else if(field.isAnnotationPresent(ColumnBinary.class)) {
            content = " blob";
        } else if(field.isAnnotationPresent(ColumnBoolean.class)) {
            content = " boolean";
        } else if(field.isAnnotationPresent(ColumnLong.class)) {
            content = " NUMBER";
        }
        return content;
    }

    private String createsqlExceptDelete(Class clazz){

        String sql = "";

        if(clazz.isAnnotationPresent(Table.class)){

            Table  annotationType =	(Table) clazz.getAnnotation(Table.class);
            String tableName =  annotationType.TableName();

            Field[]  fields =	clazz.getDeclaredFields();
            String content =getContentExceptDelete(fields);
            content = content.substring(0,content.lastIndexOf(","));
            sql = "create table "+tableName+" ("+content+" )";
        }
        return sql;
    }

    private  String getContentExceptDelete(Field[] fields){

        String content="";
        //先设置主键
        for(Field field : fields){
            field.setAccessible(true);
            if(field.isAnnotationPresent(FieldVersion.class)){
                FieldVersion fieldVersion = field.getAnnotation(FieldVersion.class);
                if(fieldVersion.deleteColumnCode() > fieldVersion.newColumnCode())continue;
            }

            if(field.isAnnotationPresent(ColumnPrimaryKey.class) && field.isAnnotationPresent(ColumnInt.class)){
                ColumnPrimaryKey primaryKey = 	field.getAnnotation(ColumnPrimaryKey.class);
                content +=	field.getName()+primaryKey.TYPE().getContent()+",";
                break;
            }
        }

        for(Field field : fields){

            field.setAccessible(true);
            if(field.isAnnotationPresent(FieldVersion.class)){
                FieldVersion fieldVersion = field.getAnnotation(FieldVersion.class);
                if(fieldVersion.deleteColumnCode() > fieldVersion.newColumnCode())continue;
            }

            if(field.isAnnotationPresent(ColumnInt.class) && !field.isAnnotationPresent(ColumnPrimaryKey.class)){
                content +=	field.getName()+" integer,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnText.class)){
                content +=	field.getName()+" text,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnFloat.class)){
                content +=	field.getName()+" float,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnDouble.class)){
                content +=	field.getName()+" double,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnString.class)){
                content +=	field.getName()+" varchar("+ColumnString.class.cast(	field.getAnnotation(ColumnString.class)).length()+"),";
                continue;
            }

            if(field.isAnnotationPresent(ColumnDate.class)){
                content +=	field.getName()+" date,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnBinary.class)){
                content +=	field.getName()+" blob,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnBoolean.class)){
                content += field.getName()+" boolean,";
                continue;
            }

            if(field.isAnnotationPresent(ColumnLong.class)){
                content += field.getName()+" NUMBER,";
            }
        }
        return content;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐