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

Posted 夜辉疾风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    

以上是关于Android数据库设计——4,动态更新数据库数据库dao层拓展的主要内容,如果未能解决你的问题,请参考以下文章

Android零基础入门第44节:ListView数据动态更新

Android AlertDialog 动态更新里面的ListView数据

基于Android公交查询系统的设计与实现(论文+程序设计源码+数据库文件)

当我从android访问Java servlet时mysql数据库没有更新

Android—SQLITE数据库的设计和升降级

app更新提示后台接口开发-数据库表设计