DButils数据库升级不丢失数据

如果版本升级,表中新增了某个字段,如何在不删除表的情况下顺利过渡,如果不做处理,数据库就会报错,没有新添加的列。修改数据库的创建方式,实现升级接口。

 1 db = DbUtils.create(context, "myXutils.sqlite",
 2                 DBVERSION, new DbUpgradeListener() {
 3
 4                     @Override
 5                     public void onUpgrade(DbUtils db, int oldVersion,
 6                             int newVersion) {
 7                         if (newVersion > oldVersion) {
 8                             updateDb(db, "mytable");
 9                         }
10                     }
11                 });
 1 protected void updateDb(DbUtils db, String tableName) {
 2         try {
 3             // 把要使用的类加载到内存中,并且把有关这个类的所有信息都存放到对象c中
 4             Class<EntityBase> c = (Class<EntityBase>) Class
 5                     .forName("com.myxutils.entity" + tableName);
 6             if (db.tableIsExist(c)) {
 7                 List<String> dbList = new ArrayList<String>();
 8                 String sql = "select * from" + tableName;
 9                 Cursor cursor = db.execQuery(sql);
10                 int count = cursor.getColumnCount();
11                 for (int i = 0; i < count; i++) {
12                     dbList.add(cursor.getColumnName(i));
13                 }
14                 cursor.close();
15                 // 把属性的信息提取出来,并且存放到field类的对象中,因为每个field的对象只能存放一个属性的信息所以要用数组去接收
16                 Field f[] = c.getDeclaredFields();
17                 for (int i = 0; i < f.length; i++) {
18                     String fildName = f[i].getName();
19                     if (fildName.equals("serialVersionUID")) {
20                         continue;
21                     }
22                     String fildType = f[i].getType().toString();
23                     if (!dbList.contains(fildName)) {
24                         if (fildType.equals("class.Java.lang.String")) {
25                             db.execNonQuery("alter table " + tableName + "add"
26                                     + fildName + "TEXT");
27                         } else if (fildType.equals("int")
28                                 || fildType.equals("long")
29                                 || fildType.equals("boolean")) {
30                             db.execNonQuery("alter table " + tableName + "add"
31                                     + fildName + "INTEGER");
32                         }
33                     }
34                 }
35             }
36         } catch (ClassNotFoundException e) {
37             e.printStackTrace();
38         } catch (DbException e) {
39             e.printStackTrace();
40         }
41
42     }
时间: 2024-10-05 21:45:55

DButils数据库升级不丢失数据的相关文章

RMAN数据库恢复之丢失数据文件的恢复

删除某一数据文件:SQL> HOST del D:\app\Administrator\oradata\orcl\USERS01.dbf 启动数据库,提示丢失数据文件4,此时数据库处理MOUNT状态: RMAN> STARTUP …… 第 1 行出现错误:ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件ORA-01110: 数据文件 4: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' 执行RMAN恢复======

Android版本升级同时Sqlite数据库的升级及之前数据的保留

http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid=166052 做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已

【转】Android版本升级同时Sqlite数据库的升级及之前数据的保留

做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段.并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;2 ALTER TABLE Sub

Android 数据库升级解决方案

转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢. 总体思路 1,将表A重命名,改了A_temp. 2,创建新表A. 3,将表A_temp的数据插入到表A. 下面代码列出了更新表的实现,upgradeTables,给

Android 数据库升级完整解决方案

数据库升级的意义 我们在开发Android应用的时候,不可避免地要使用数据库.而数据库的结构在第一版的时候定下来,之后发布功能更新,或增加业务逻辑,原来的数据库结构可能就不适用了.而如果数据库的结构与之前版本的结构不同,新版本的应用读取旧数据库肯定会出问题.解决办法只有两种: 1.让用户卸载老版本再安装新的程序: 2.软件自行更新数据库结构. 第一种办法很明显不具备可操作性,而且用户一旦卸载软件,数据就丢失了,这是不能容忍的事情.因此,作为开发者必须妥善处理数据库的升级问题. 当然了,有的同学会

数据库升级问题—ORA-39700: database must be opened with UPGRADE option

1. 错误描述 一个数据较长时间未使用了,最近启动时出现如下错误: SQL> startup Oracle instance started. Total System Global Area 4932501504 bytes Fixed Size                  2103096 bytes Variable Size            889194696 bytes Database Buffers        4026531840 bytes Redo Buffers

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())

数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0版本升级到1.1版本时,老的数据不能丢. 那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库. 换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值. 当然有的时候我们对更新后的 版本并没有什么好感,

iOS 数据库升级 如何进行操作?

在iOS开发中,经常会遇到数据库升级,修改删除表的某些字段,这就需要我们来进行处理了,下面分析两种数据库的升级处理问题! 1.比如:我们常使用fmdb或者其他方式创建sqlite数据库,但是由于版本迭代问题,常常有需求要更新数据库,比如加字段.删除.修改字段等等,怎么样才能升级数据库且保持原来存的数据有效呢,上代码: const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1; @implementation KSFamilyListDBManag

Android中数据库升级onUpgrade方法说明

Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的“数据库升级”是指什么? 你开发了一个程序,当前是1.0版本.该程序用到了数据库.到1.1版本时,你在数据库的某个表中增加了一个字段.那么软件1.0版本用的数据库在软件1.1版本就要被升级了. 2. 数据库升级应该注意什么? 软件的1.0版本升级到1.1版本时,老的数据不能丢.那么在1.1版本的程序中就要有地方能够检测