数据库升级总结

如果新版本增加了表中的字段,那么原来的数据库中的数据必须做好备份插入新表中。

stackoverflow上给出的标准步骤

You should always have the new table creation query at hand, and use that for upgrade and transfer any existing data. Note: that the onUpgrade methods runs one for your sqlite helper object and you need to handle all the tables in it.

So what is recommended onUpgrade:

  • beginTransaction
  • run a table creation with if not exists (we are doing an upgrade, so the table might not exists yet, it will fail alter and drop)
  • put in a list the existing columns List<String> columns = DBUtils.GetColumns(db, TableName);
  • backup table (ALTER table " + TableName + " RENAME TO ‘temp_" + TableName)
  • create new table (the newest table creation schema)
  • get the intersection with the new columns, this time columns taken from the upgraded table (columns.retainAll(DBUtils.GetColumns(db, TableName));)
  • restore data (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • remove backup table (DROP table ‘temp_" + TableName)
  • setTransactionSuccessful

(This doesn‘t handle table downgrade, if you rename a column, you don‘t get the existing data transfered as the column names do not match).

public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
    List<String> ar = null;
    Cursor c = null;
    try {
        c = db.rawQuery("select * from " + tableName + " limit 1", null);
        if (c != null) {
            ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
        }
    } catch (Exception e) {
        Log.v(tableName, e.getMessage(), e);
        e.printStackTrace();
    } finally {
        if (c != null)
            c.close();
    }
    return ar;
}

public static String join(List<String> list, String delim) {
    StringBuilder buf = new StringBuilder();
    int num = list.size();
    for (int i = 0; i < num; i++) {
        if (i != 0)
            buf.append(delim);
        buf.append((String) list.get(i));
    }
    return buf.toString();
}

示例

http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/providers/calendar/CalendarDatabaseHelper.java/?v=source

时间: 2024-10-24 09:37:15

数据库升级总结的相关文章

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3升级到11.2.0.4完整步骤 说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1升级到11.2.0.3的过程,当然RAC的升级是会有所不同.但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance. Oracle 11.2.0.4的Patchset No:19852360下载需要有Oracle Support才可以.  Patchset包含有7个

数据库升级问题—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

数据库升级ora-04063 DBMS_REGISTRY has error

在做Oracle数据库从11.2.0.1.0升级到11.2.0.2.8时,软件升级没有问题,实例升级没有问题,升级psu的时候. 运行@?/rdbms/admin/catbundle psu apply时,只显示一部分信息,即终止apply. 在dba_registry_history中未显示11.2.0.2.8的psu信息: select * from dba_registry_history; ACTION_TIME                    ACTION          NA

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

数据库升级代码学习

  业务场景及需求:全国每一个银行营业网点[指跟公司合作的]产品上线后.肯定须要升级业务以应对新的功能需求,那么数据库每次升级更新时都是在数据库管理工具中运行升级脚本.很不方便.此时需求:可以在业务系统代码中设置开关,须要升级的时候打开开关系统自己主动直接完毕升级. 思路:1)数据库里面有个对应的版本号号,服务里面有个版本号文件[以要升级到的版本号号命名]. 2)升级的时候查出服务里面的版本号和数据库里面的版本号,比对:假设版本号一样不升级.假设版本号不一样就运行服务里面的升级脚本. 以下看看基

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

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

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304 一.   补丁描述 参考metalink doc: (Doc ID 19774304.8) Bug19774304 - 12.1.0.2 Bundle Patch 2 for Engineered Systems and DB In-Memory (Nov2014) (Doc ID 19774304.8) 二.   补丁包含 19649591 DATABASE BUNDLE PATCH 12.1.0.2.2 (O

探索Oracle之数据库升级四 11.2.0.4.0 PSU 11.2.0.4.3

探索Oracle之数据库升级四 11.2.0.4.0 PSU 11.2.0.4.3   一.  检查当前数据库PSU号: [[email protected] ~]$ cd/DBSoft/Product/11.2.4/db_1/OPatch/ [[email protected] OPatch]$ ls crs docs emdpatch.pl jlib ocm opatch opatch.bat opatchdiag opatchdiag.bat opatch.ini opatch.pl op

自动化升级工具之客户端升级工具之数据库升级操作

目前客户端工具还是一个以Winform的窗口程序,文件结构如图: 图1 1.两个config的配置文件,分别一个是连接本地开发环境下在数据库,另外一个基本参数配置文件 A.DB.config为数据库连接内容如下: <DBConfig name="dbtestDBByMP" connectionString="server=(local);database=dbtest;uid=sa;pwd=123456;" providerName="System.