Android数据库设计——4,动态更新数据库、数据库dao层拓展

动态更新

获得从服务器传来的更新数据,解析成可执行的sql语句

public class UpdateDbBean {
    private CreateVersion createVersion;//需要升级的数据库
	
    public CreateVersion getCreateVersion() {
        return createVersion;
    }

    public void setCreateVersion(CreateVersion createVersion) {
        this.createVersion = createVersion;
    }

    public UpdateStep getUpdateStep() {
        return updateStep;
    }

    public void setUpdateStep(UpdateStep updateStep) {
        this.updateStep = updateStep;
    }

    //升级的数据库的版本和表
    public class CreateVersion {
        private long createVersion;//当前需要升级到的目标版本
        private List<CreateDb> createDbList;//需要升级的数据库表

        public long getCreateVersion() {
            return createVersion;
        }

        public void setCreateVersion(long createVersion) {
            this.createVersion = createVersion;
        }

        public List<CreateDb> getCreateDbList() {
            return createDbList;
        }

        public void setCreateDbList(List<CreateDb> createDbList) {
            this.createDbList = createDbList;
        }
		//需要升级的数据库的表名和执行sql
        public class CreateDb {
            private String name;//表名
            private List<String> createSqls;//创建表的sql,按顺序执行

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public List<String> getCreateSqls() {
                return createSqls;
            }

            public void setCreateSqls(List<String> createSqls) {
                this.createSqls = createSqls;
            }
        }
    }
}
//从服务器拿到了更新数据库的数据后,解析成UpdateDbBean对象
public class UpdateDbManager {
    private UpdateDbBean updateDbBean;

    public void setUpdateDbBean(UpdateDbBean updateDbBean) {
        this.updateDbBean = updateDbBean;
    }
	//开始更新
    public void beginUpdateDb() {
        //得到当前数据库的版本号,这里写死1;实际情况应该是本地app保存的数据库版本
        long thisVersion = 1;
        //得到要升级的数据库信息
        UpdateDbBean.CreateVersion createVersion = updateDbBean.getCreateVersion();
        //要升级的版本号
        long fromVersion = createVersion.getCreateVersion();
        //执行升级
        if (fromVersion > thisVersion) {
            List<UpdateDbBean.CreateVersion.CreateDb> createDbs = createVersion.getCreateDbList();
            if (createDbs != null && !createDbs.isEmpty()) {
                UserDao userDao = BaseDaoFactory.getInstance().getBaseDao(UserDao.class, User.class);
                for (UpdateDbBean.CreateVersion.CreateDb createDb : createDbs) {
                    //这里涉及到多库、多表的情况。
                    //一条sql可能要在多个库和多张表中同时执行
                    //这里,模拟多库/多表的更新
                    //得到当前user所在的数据库的文件路径
                    List<User> users = userDao.queryByWhere(new User());
                    if (users != null && !users.isEmpty()) {
                        for (User user : users) {
                            String tableName = createDb.getName();
                            //查询到每个user对应的表的sqlitedatabase对象,用于执行sql
                            SQLiteDatabase sqLiteDatabase = getSqlliteDataBase(tableName, userDao, user);
                            List<String> createSqls = createDb.getCreateSqls();
                            //开启事务,保证多条sql同时执行成功
                            sqLiteDatabase.beginTransaction();
                            try {
                                for (String createSql : createSqls) {
                                    sqLiteDatabase.execSQL(createSql);
                                }
                                //标记事务执行成功
                                sqLiteDatabase.setTransactionSuccessful();
                            } catch (Exception e) {
                                //执行失败则整个事务都不会提交
                                e.printStackTrace();
                            } finally {
                                //关闭事务
                                sqLiteDatabase.endTransaction();
                            }
                        }
                    }
                }
            }
        }
    }

    //通过userid查询到每个用户分库
    private SQLiteDatabase getSqlliteDataBase(String tableName, UserDao userDao, User user) {
        //得到当前user所在的数据库的文件路径
        String dbfilepath = BaseDaoSubFactory.getInstance().getSeparateTablePath(userDao, user);
        SQLiteDatabase sqLiteDatabase = null;
        //当前数据库是user的分库表,因为这个userdao是从basedao实例化出来的,所以,它不是分库数据库名,而是子库名字
        if ((tableName).equals(userDao.getTableName())) {
            //执行更新sql
            //先备份再更新
            //备份的规则是建立当前用户
            SQLiteDatabase sqLiteDatabaseBackup = SQLiteDatabase.openOrCreateDatabase(BaseDaoSubFactory.getInstance().getSeparateTableBackupPath(userDao, user), null);
            String sql = "";//这里是将当前User的信息保存起来的sql
            sqLiteDatabaseBackup.execSQL(sql);
            //创建数据库
            sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(dbfilepath, null);

        }
        return sqLiteDatabase;
    }
}
public class BaseDaoSubFactory extends BaseDaoFactory {
    //其他代码
    
	//创建当前用户的分数据库的备份路径
    public <M> String getSeparateTableBackupPath(BaseDao<M> baseDao, M m) {
        String separateTablePath = "";
        //创建分库的唯一标识
        String primary = baseDao.getPrimary(m);
        //获取到了唯一标识,创建数据库文件
        if (!TextUtils.isEmpty(primary)) {
            File file = new File(def_db_path);
            boolean iscreate = true;
            //不存在默认的数据库则创建
            if (!file.exists()) {
                //创建成功
                if (!file.mkdirs()) {
                    iscreate = false;
                }
            }
            if (iscreate) {
                //如果数据库根目录存在,则返回分库路径
                separateTablePath = file.getAbsolutePath() + "/" + baseDao.getTableName() + "_" + primary + "_" + DbConstant.db_version + "_backup.db";
            }
        }
        return separateTablePath;
    }
}

数据库dao层拓展

随着版本的迭代,数据库的设计也会出现变化,可以通过迭代BaseDao的方法来不断的更新数据库操作

/**
 * Describe: basedao的拓展设计
 * 当我们有了新的需求或者新的方法需要去迭代更新的时候,我们就可以通过继承basedao的方法来迭代更新
 */
public class BaseDaoImpl<T> extends BaseDao<T> {
    
	/**
     * 新增简化后的条件查询
     *
     * @param where 查询条件
     * @return 查询结果
     */
    public List<T> queryByWhere(T where) {
        return queryByWhere(where, null, null, null);
    }
}
发布了113 篇原创文章 · 获赞 48 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/yehui928186846/article/details/102807886
今日推荐