您的位置:首页 > 移动开发 > Android开发

Android数据库升级最佳方案

2016-01-01 22:53 525 查看

概述

在android开发的时候,难免会遇上数据库升级的时候,比如在原有数据库 表中增加字段,或者新增表,这时候就面临数据库升级的操作了,

一般这时候,我们的应用是已经有了一定的用户的,我们需要保证原来的数据不会因为版本的升级而丢失.

创建数据库

Android 系统中为我们提供了SQLite的支持.同时提供了一个SQLiteOpenHelper帮助我们来创建数据库,这个类是一个抽象类,

我们需要继承并实现其中的onCreate()和onUpgrade()的方法来创建数据库和升级数据库.

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";

private Context mContext;

public MyDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
onCreate(db);
}

}


升级数据库

在android中每一个数据库版本都对应一个版本号,当指定的版本号大于版本库版本号的时候,就会进入onUpgrade()方法

如上所示,在升级的时候 先把原来的表删除,后再重新创建.淡然这种是最糟糕的办法 ,原来的数据无法保存,

最佳的办法就是在onUpgrade()方法中根据版本号判断,来执行相应的改变即可

新增表

public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
db.execSQL(CREATE_CATEGORY);
}

}


这样的话,如果用户当前版本号是1,就会创建一个Category表,如果用户安装的是第二版程序的话就会两张表一起创建,当覆盖安装的时候.就会进入onUpgrade()创建一张Category表

新增字段

如果要在新版中给Book表新增一个字段category_id,

public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "category_id integer, "
+ "name text)";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db.execSQL("alter table Book add column category_id integer");
}

}


从中可以看出如果用户之前没有安装过程序就会直接创建带 category_id 的book 表

而如果是覆盖安装的话,注意这里面switch是没有break的,

如果用户是从第二版升级,那么case 2 会执行

如果用户直接从第一版升级,那么case 1 和case 2 都会执行.这样既照顾到跨版本升级的问题,也不会因为升级而丢失数据了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: