Android数据库版本升级

android应用在发布后,会进行版本迭代。其中因为需求的更改,功能的扩充,可能会涉及到数据库的升级。如果只是添加表,还比较好处理,直接在public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)中新建表就OK了,但是涉及到已存在的表的结构发生变更,就比较麻烦了,特别是之前已经升级过表的结构,再次升级的时候需要考虑用户当前的版本,也就是需要在代码里对不同版本的数据库,升级到最新版本进行处理。其实这个跟制作增量升级包差不多,需要为每个历史版本制作一个增量包。

虽然CSDNBlog目前还没有涉及到数据库升级,但是提前准备好还是有必要的。接下来就把这两天学习到的sqlite数据库升级总结一下:

当数据库不存在的时候,会调用SQLiteOpenHelper的onCreate()方法;之后启动应用,若数据库已经存在,就不会再次调用该方法了。当数据库版本号发生变动时会调用相应的方法。

<span style="white-space:pre">	</span>// 构造方法
	private DB(Context context) {
		// 创建数据库
		super(context, DB_NAME, null, DATABASE_VERSION);
		Log.i(TAG, "create database");
	}

上面的代码是创建SQLiteOpenHelper的实例(DB类继承的SQLiteOpenHelper),其中DATABASE_VERSION就是自定义的数据库版本号。

如果应用启动时发现DATABASE_VERSION小于当前数据库的版本号时,也是就是需要对数据库进行降级操作,会调用下面的方法:

	@Override
	public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		super.onDowngrade(db, oldVersion, newVersion);
	}

当然,基本上不会使用降级,我在试验的时候,忘记当前的数据库版本号,也没有覆写onDowngrade方法,随便给个版本号,运行之后会出现无响应,或者其他一些奇怪的现象。

进行数据库升级的时候,会调用onUpgrade方法,在此方法里面,我们不仅要更新表结构,还要考虑到表中的数据保留问题。当然直接删除旧表,重新建表格会很爽,但是用户积累的数据就没有了。也就是说,我们需要把旧表的数据保存到新表。

思路是:先更改旧表的表名(如果升级后表名发生变化的话,就不需要这一步了),新建表,然后就根据旧表的结构把数据重新插入新表。

	// 版本更新时调用
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

		//需要转移数据的字段
		String columns = "";

		Log.i(TAG, "oldVersion=" + oldVersion);
		//根据不同的数据库版本进行数据的备份
		switch (oldVersion) {
		case 1:
			columns = BlogInfo.TITLE + "," + BlogInfo.LINK + ","
					+ BlogInfo.DESCRIPTION + "," + BlogInfo.MSG + ","
					+ BlogInfo.DATESTAMP + "," + BlogInfo.TIMESTAMP_READ + ","
					+ BlogInfo.CONTENT + "," + BlogInfo.TYPE_BLOG + ","
					+ BlogInfo.TYPE_ARTICLE;
			break;

		case 2:

			break;

		default:
			db.execSQL("DROP TABLE IF EXISTS " + TB_BLOG);
			db.execSQL("DROP TABLE IF EXISTS " + TB_BLOGER);
			onCreate(db);// 创建新表
			return;
		}

		//开始准备数据
		try {

			db.beginTransaction();

			Log.i(TAG, "Rename table.");
			String tempTableName = TB_BLOG + "_temp";
			String sql = "ALTER TABLE " + TB_BLOG + " RENAME TO " + tempTableName;
			db.execSQL(sql);

			Log.i(TAG, "Create table.");
			onCreate(db);// 创建新表

			Log.i(TAG, "Load data");
			sql = "INSERT INTO " + TB_BLOG + " (" + columns + ") " + " SELECT " + columns + " FROM " + tempTableName;
			db.execSQL(sql);

			Log.i(TAG, "Drop the temporary table.");
			db.execSQL("DROP TABLE IF EXISTS " + tempTableName);

			db.setTransactionSuccessful();
			db.endTransaction();
		} catch (Exception e) { }
	}

如果数据库有多个历史版本,就需要在switch中一一处理,当然,如果没有考虑到的情况,只能惨然的删除重建了。

其中有一句是直接调用回调函数onCreate(db)

onCreate(db);// 创建新表

虽然感觉很奇怪,但确实可行。

因为暂时还没有用到数据库的升级,所以现在只是简单的把功能实现,以后根据需求再完善。

如有大神指点,感激不尽!

时间: 2024-10-01 03:20:39

Android数据库版本升级的相关文章

浅谈Android数据库版本升级及数据的迁移

概述 Android开发涉及到的数据库采用的是轻量级的SQLite3,而在实际开发中,在存储一些简单的数据,使用SharedPreferences就足够了,只有在存储数据结构稍微复杂的时候,才会使用数据库来存储.而数据库表的设计往往不是一开始就非常完美,可能在应用版本开发迭代中,表的结构也需要调整,这时候就涉及到数据库升级的问题了. 数据库升级 数据库升级,主要有以下这几种情况: 增加表 删除表 修改表 增加表字段 删除表字段 增加表和删除表问题不大,因为它们都没有涉及到数据的迁移问题,增加表只

android数据库版本升级总结

前序: Android版本升级同时Sqlite数据库的升级及之前数据的保留 原理分析: 在android应用程序需要升级时,如果之前的数据库表结构发生了变化或者新添加了表,就需要对数据库进行升级,并保留原来的数据库数据. 程序如何知道数据库需要升级? SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号.比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中. 到了1

Android SQLite数据库版本升级原理解析

Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade. 1.v1.0(直接安装v1.0) 二.软件v2.0 有2种安装软件情况: 1.v1.0   -->  v2.0              不走onCreate,走onUpgrade 2.v2.0(直接安装v2.0)          走onCrea

【转】Android使用SQLite数据库版本升级

Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade. 1.v1.0(直接安装v1.0) 二.软件v2.0 有2种安装软件情况: 1.v1.0   -->  v2.0              不走onCreate,走onUpgrade 2.v2.0(直接安装v2.0)          走onCrea

Android数据库高手秘籍(三)——使用LitePal升级表

在上一篇文章中,我们学习了LitePal的基本用法,体验了使用框架来进行创建表操作的便利.然而大家都知道,创建表只是数据库操作中最基本的一 步而已,我们在一开始创建的表结构,随着需求的变更,到了后期是极有可能需要修改的.因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就 一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法.如果你还没有看过前一篇文章,建议先去参考 一下 Android数据库高手秘籍(二)——创建表和LitePal的

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

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

SQLite数据库版本升级的管理实现

我们知道在SQLiteOpenHelper的构造方法: super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 中最后一个参数表示数据库的版本号.当新的版本号大于当前的version时会调用方法: onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 所以我们的重点是在该方法中实现SQLite数据库版本升级的管理

如何将Android数据库操作通用化(一)

概述 在开始考虑Android的数据库操作之前,我们先回想一下Web方面的数据库操作.如果我们只是停留在JDBC的简单使用和封装上(比如纯JDCB,或者DBUtils),即使我们对数据库的增删改查操作进行了接口的抽取,代码依旧会和业务有很强的耦合性. 经过我们分析,解除耦合性的关键在于如何解决自动映射"实体类 与 数据库表"之间的对应关系.如果能够做到这一步,那么我们就能够更好的解耦了,也能降低我们的代码重复率. 如果我们再跨前一步,使用更为优秀的框架(比如:Hibernate),这一

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

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