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 都会执行.这样既照顾到跨版本升级的问题,也不会因为升级而丢失数据了
相关文章推荐
- android 数据库之greendao
- Android的AdapterViewFlipper
- Android的Spinner
- 学习Android从0开始之基础篇(1)-Android的四大基本组件
- Android开发之 Android 的基本组件的概述
- Android的AnalogClock和DigitalClock
- Android中View类OnClickListener和DialogInterface类OnClickListener导入包冲突
- Android的TextureView
- 解决AndroidStudio导入工程报错:“Your project path contains non-ASCII characters.”
- Android的ToggleButton
- android属性大全
- Android的CheckBox复选框
- Android的sdk下载问题
- Android中常用单位(dpi、px、dp、sp)
- Android中ImageView.ScaleType属性值
- Android的ImageView图片
- android使用include调用内部组件报空指针异常解决方案
- Android开发 更改返回button的图标
- Android开发-百度地图(一)——准备
- android-自定义-悬浮控件