开源一个轻量级无侵入式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(); for(int i=0;i
运行效果
后续工作 :
1.完成针对room数据的支持,避免每次写Migration升级函数。
喜欢的朋友可以移步至gitee查看源码:SpeSqliteManager4Android: 一个用来管理android数据库自动字段升级的管理类