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

参考:https://blog.csdn.net/meryvn/article/details/48786495

项目中有时候会涉及到修改数据库表的字段,或者创建数据库表。这时候需要关注数据库升级、降级的方法调用,并做相关处理,否则版本不一致时,会导致数据库不能用,应用出现ANR等异常。

DBHelper类

public class DBHelper  extends SQLiteOpenHelper{
static finanl int DATABASE_VERSION_5 = 5;
static finanl String DATABASE_NAME = "zxts.sms.db";

private DBHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION_5);
}

@Override
public void onCreate(SQLiteDatabase db){
//create table
  /**      
* 这个方法
 * 1、在第一次打开数据库的时候才会走
 * 2、在清除数据之后再次运行-->打开数据库,这个方法会走
 * 3、没有清除数据,不会走这个方法
* 4、数据库升级的时候这个方法不会走
  */
}


@Override
public void onUpdate(SQLiteDatabase db, int oldVersion, int newVersion){
//版本要升级时
  /**      
* 这个方法
 * 1、在第一次打开数据库的时候不会走
 * 2、在清除数据之后再次运行,这个方法不会走
* 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
  */
}

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
//版本要降级时,执行降级操作
  /**      
* 这个方法
 * 1、只有新版本比旧版本低的时候才会执行
 * 2、如果不执行降级操作,会抛出异常
  */
super.onDowngrade(db, oldVersion, newVersion);
}

}

SQLiteOpenHelper
这是一个辅助类,用来管理数据库的创建和数据库的版本。

你要创建一个这个类的子类来实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法,以及可选的onOpen(SQLiteDatabase)方法,并且这个类要管理数据库的状态,如果数据库存在,就打开数据库,否则就创建数据库,并且在需要的时候也会更新数据库。使用事务来确保数据库始终在正确的状态中。

这个类让ContentProvider的实现变的容易,它把数据库的打开和升级延迟到第一次使用,从而避免了因升级数据库的长时间运行而造成的应用程序阻塞。

Public构造器

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CuresorFactory factory, int version)

创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。

参数说明:

context:用于打开或创建数据库;

name:指定数据库的文件名,null指定一个内存中的数据库

factory:用于创建游标对象,或默认的null;

version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。

public abstract void onCreate(SQLiteDatabase db)

数据库被首次创建时,会调用这个方法。这时创建数据库表和表初始化的地方。

参数:

db:要创建的数据库。

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。

这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本

public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要升级时,会调用这个方法。应该使用这个方法来实现删除表、添加表或者做一些需要升级新的策略版本的事情。

如果要给表添加一个新列,那么使用使用ALTER TABLE能够把新列插入到表中。如果要重命名或删除列,那么你能够使用ALTER TABLE能够重命名旧表,然后,创建一个新表,并把旧表中内容复制到新表中。

@Override
 public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
  if(oldVersion < 3){
     db.execSQL("CREATE TABLE IF NOT EXISTS addrbook (id interger default 0, name text default '', number text default '');")
     oldVersion = 3;
   }
   if(oldVersion < 5){
   db.execSQL("ALTER TABLE gotasettings ADD COLUMN mds_server_ip TEXT DEFAULT '';" );
   oldVersion = 5;
  }
 }

这个方法是事务中执行的,如果有异常被抛出,所有的改变都会被自动的回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本

你可能感兴趣的:(Android)