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公交查询系统的设计与实现(论文+程序设计源码+数据库文件)