开源一个轻量级无侵入式android数据库自动升级的管理类

SpeSqliteManager4Android
介绍
一个轻量级无侵入式管理android数据库自动升级的管理类(支持SQLiteOpenHelper、room(编码中))
实际导入代码


核心代码
1. 数据库配置文件dbupdate.json
{
  "dbName": "localdb",
  "dbVersion": 5 ,
  "dbTables": [
    {
      "tableName":"dbconfig",
      "columns":[
        {
          "key": "dbversion",
          "keyType": "TEXT"
        },
        {
          "key": "dbname",
          "keyType": "TEXT"
        },
        {
          "key": "dbtables",
          "keyType": "TEXT"
        }
      ]
    },
    {
      "tableName":"teacher",
      "columns":[
        {
          "key": "id",
          "keyType": "INTEGER PRIMARY KEY AUTOINCREMENT"
        },
        {
          "key": "name",
          "keyType": "TEXT"
        },
        {
          "key": "age",
          "keyType": "TEXT"
        },
        {
          "key": "sex",
          "keyType": "TEXT"
        }
      ]
    }
  ]
}

2.开始调用
SpeSqliteDBService.getInstance(this);

3.数据库相关模型
public class SpeSqliteColumnSettingModel {
    /**
     * key名
     */
    public String key;

    /**
     * 该key的在sql中的key字段修饰,比如INTEGER PRIMARY KEY AUTOINCREMENT或TEXT
     */
    public String keyType;
}

public class SpeSqliteSettingModel {
    /**
     * 数据库名
     */
    public String dbName;

    /**
     * 数据库版本号
     */
    public int dbVersion;

    /**
     * 所有表数组
     */
    public ArrayList dbTables;
}

public class SpeSqliteTableSettingModel {
    /**
     * 表名
     */
    public String tableName;

    /**
     * 当前表字段设计
     */
    public ArrayList columns;

    /**
     * 是否被索引过:代表是否在新表里被删除了
     */
    public  boolean indexed;

}

4.SQLiteOpenHelper子类,可以看到改完后该类非常干净。
public class SpeSqliteDBService extends SQLiteOpenHelper {
    private static final String TAG     = "SpeSqliteDBService";
    private static SpeSqliteDBService instance  = null;
    private Context context = null;
    private SQLiteDatabase db = null;
    public static synchronized SpeSqliteDBService getInstance(Context context) {
        if (instance == null){
            synchronized (SpeSqliteDBService.class){
                if (instance == null){
                    instance = new SpeSqliteDBService(context);
                    instance.context = context;
                    instance.db = instance.getWritableDatabase();
                }
            }
        }
        return instance;
    }

    public SpeSqliteDBService(Context context) {
        super(context,SpeSqliteUpdateManager.getInstance().init(context).currentAppDBSetting().dbName,
                null,SpeSqliteUpdateManager.getInstance().init(context).currentAppDBSetting().dbVersion);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        SpeSqliteUpdateManager.getInstance().create(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) {
         SpeSqliteUpdateManager.getInstance().upgrade(db);
    }
}

5.SpeSqliteUpdateManager 负责针对本地db的创建、新建表、表字段升级、删除表,通过配置的方式去升级数据库,减少代码的改动,核心思想:以静制动

public class SpeSqliteUpdateManager {
    /**
     *主app的context
     */
    private Context appContext = null;

    /**
     *本地db中的配置项
     */
    private SpeSqliteSettingModel localDBSetting = null;

    /**
     *当前app中assets的配置项
     */
    private SpeSqliteSettingModel currentAppDBSetting = null;

    private final  Gson gson = new Gson();

    private String currentDBJson = null;

    private static final String kDBJsonName  = "dbupdate.json";

    private SpeSqliteUpdateManager() {

    }

    public static SpeSqliteUpdateManager getInstance() {
        return SingletonClassInstance.instance;
    }

    private static class SingletonClassInstance {
        private static final SpeSqliteUpdateManager instance = new SpeSqliteUpdateManager();
    }

    public SpeSqliteUpdateManager init(Context context){
        this.appContext =context;
        return this;
    }

    /**
     * 数据库第一次创建时的调用函数
     * @param db db
     */
    public void create(SQLiteDatabase db){
        SpeSqliteSettingModel currentDBModel = SpeSqliteUpdateManager.getInstance().currentAppDBSetting();
        for(int i=0;i=_old.columns.size()){
                SpeSqliteColumnSettingModel column = _new.columns.get(i);
                String sql = " alter table "+_old.tableName+" add column ";
                sql+=column.key;
                sql+=" ";
                sql+= column.keyType;
                executeSQL(db,sql);
            }
        }
    }

    /**
     * 新增表
     * @param db db
     * @param table 表配置
     */
    private void createTableSQL(SQLiteDatabase db,SpeSqliteTableSettingModel table){
        String sql = " create table if not exists "+table.tableName+" (";
        for(int j=0;j tables = new ArrayList<>();
            for(int i=0;i

运行效果

后续工作 :

1.完成针对room数据的支持,避免每次写Migration升级函数。

喜欢的朋友可以移步至gitee查看源码:SpeSqliteManager4Android: 一个用来管理android数据库自动字段升级的管理类

页面更新:2024-04-12

标签:表字   数据库   子类   表里   数组   字段   版本号   函数   核心   代码

1 2 3 4 5

上滑加载更多 ↓
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top