(二)GreenDao3.0的数据库升级
来源:互联网 发布:主角数据化的小说 编辑:程序博客网 时间:2024/05/19 10:12
参考网上一个工具类:
public class MigrationHelper { /** * 调用升级方法 * @param db * @param daoClasses 一系列dao.class */ public static void migrate(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) { //1 新建临时表 generateTempTables(db, daoClasses); //2 创建新表 createAllTables(db, false, daoClasses); //3 临时表数据写入新表,删除临时表 restoreData(db, daoClasses); } /** * 生成临时表,存储旧的表数据 * @param db * @param daoClasses */ private static void generateTempTables(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) { for (int i=0;i<daoClasses.length;i++){ DaoConfig daoConfig = new DaoConfig(db,daoClasses[i]); String tableName = daoConfig.tablename; if (!checkTable(db,tableName)) continue; String tempTableName = daoConfig.tablename.concat("_TEMP"); StringBuilder insertTableStringBuilder = new StringBuilder(); insertTableStringBuilder.append("alter table ") .append(tableName) .append(" rename to ") .append(tempTableName) .append(";"); db.execSQL(insertTableStringBuilder.toString()); } } /** * 检测table是否存在 * @param db * @param tableName */ private static Boolean checkTable(Database db,String tableName){ StringBuilder query = new StringBuilder(); query.append("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='").append(tableName).append("'"); Cursor c = db.rawQuery(query.toString(), null); if (c.moveToNext()){ int count = c.getInt(0); if(count>0){ return true; } return false; } return false; } /** * 删除所有旧表 * @param db * @param ifExists * @param daoClasses */ private static void dropAllTables(Database db, boolean ifExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { reflectMethod(db, "dropTable", ifExists, daoClasses); } /** * 创建新的表结构 * @param db * @param ifNotExists * @param daoClasses */ private static void createAllTables(Database db, boolean ifNotExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { reflectMethod(db, "createTable", ifNotExists, daoClasses); } /** * 创建根删除都在NoteDao声明了,可以直接拿过来用 * dao class already define the sql exec method, so just invoke it */ private static void reflectMethod(Database db, String methodName, boolean isExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { if (daoClasses.length < 1) { return; } try { for (Class cls : daoClasses) { //根据方法名,找到声明的方法 Method method = cls.getDeclaredMethod(methodName, Database.class, boolean.class); method.invoke(null, db, isExists); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 临时表的数据写入新表 * @param db * @param daoClasses */ private static void restoreData(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) { for (int i = 0; i < daoClasses.length; i++) { DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); String tableName = daoConfig.tablename; String tempTableName = daoConfig.tablename.concat("_TEMP"); if (!checkTable(db,tempTableName)) continue; // get all columns from tempTable, take careful to use the columns list List<String> columns = getColumns(db, tempTableName); //新表,临时表都包含的字段 ArrayList<String> properties = new ArrayList<>(columns.size()); for (int j = 0; j < daoConfig.properties.length; j++) { String columnName = daoConfig.properties[j].columnName; if (columns.contains(columnName)) { properties.add(columnName); } } if (properties.size() > 0) { final String columnSQL = TextUtils.join(",", properties); StringBuilder insertTableStringBuilder = new StringBuilder(); insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" ("); insertTableStringBuilder.append(columnSQL); insertTableStringBuilder.append(") SELECT "); insertTableStringBuilder.append(columnSQL); insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";"); db.execSQL(insertTableStringBuilder.toString()); } StringBuilder dropTableStringBuilder = new StringBuilder(); dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); db.execSQL(dropTableStringBuilder.toString()); } } private static List<String> getColumns(Database db, String tableName) { List<String> columns = null; Cursor cursor = null; try { cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 0", null); if (null != cursor && cursor.getColumnCount() > 0) { columns = Arrays.asList(cursor.getColumnNames()); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) cursor.close(); ; if (null == columns) columns = new ArrayList<>(); } return columns; }}
(2)在自定义的帮助类中使用就可以了
public class DBHelper extends DaoMaster.OpenHelper { public static final String DBNAME = "lenve.db"; public DBHelper(Context context) { super(context, "lenovo.db", null); } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { super.onUpgrade(db, oldVersion, newVersion); MigrationHelper.migrate(db,CommentDao.class);//可以写多个Dao类。 }}
0 0
- (二)GreenDao3.0的数据库升级
- GreenDao3.0升级数据库
- GreenDao3.0数据库升级
- greendao3.0以上使用步骤(二):数据库到底该怎么升级
- Android数据库GreenDAO3.2.2的使用(四、数据库升级)
- Android greenDao3.0的开发实战,包括版本升级(二)
- GreenDao3.0+的配置使用以及数据库升级
- Android数据库GreenDAO3.2.2的使用(二,数据库使用)
- GreenDao3 数据库升级问题
- GreenDao3.0使用(二)
- greenDAO的使用详解---(2)greenDAO3.2.2数据库的升级
- Android数据库框架——GreenDao3.2的配置 升级
- GreenDao3.2.2集成使用以及数据库的升级
- greenDAO3 入门(配置,基本操作,数据库升级)
- GreenDao3.0学习(二)
- 数据库框架GreenDao3.0
- GreenDao3.2.2 App数据库升级遇到问题
- greenDao3.0及以上数据库升级并保留原数据库数据,详细教程
- java缓存技术概括
- 作业3:DDS
- java-Date类
- django认证系统实现自定义权限管理
- Linux环境下共享库(动态链接库)的简要介绍(如何创建共享库)
- (二)GreenDao3.0的数据库升级
- dns服务搭建
- PHP入门Demo(只为前端了解)When you really want to know a thing, You will see is really very simple.
- Kinectfusion开源实现_配置Kinfu环境_Cmake编译PCL点云库_Kinect3D重建
- C#窗体绘制等值线
- Swagger与SpringMVC整合(附源码!!!)
- OPC与OPC UA
- 润乾报表单独部署(连接数据库)
- 101. Symmetric Tree