SQLite是Android内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库建立和版本升级问题的抽象类。咱们能够继承这个抽象类,实现它的一些方法来对数据库进行自定义操做。下面两个方法必须重写:html

public void onCreate(SQLiteDatabase db)java

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

另外SQLiteOpenHelper子类在构造实例时必须指定当前数据库的名称(name)、版本号(version)。而这里名称就决定了数据库存储 时的文件名称,而这里的版本号与App在AndroidMainfest.xml定义的versionCode没有绝对关联。也就是在App更新时若是数 据库的数据结构没有发生变化那么数据库的版本号则不用增长。数据库

onCreate:调用时机是用户首次安装应用后启动,或是清除App数据库文件后启动。这时能够在这个函数中完成初始的数据表的建立。数据结构

onUpgrade:调用时机是用户在作应用更新,覆盖安装后启动,若是新版本中数据库版本号要比旧版本中的数据库版本号高则会调用。这时能够在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。ide

还有一个通常状况下不须要重写,但在应用出现逆向降级(如应用由版本号4降级安装版本号为3的包)时必须重写的方法onDowngrade,若是应用降级覆盖安装时没有重写该方法则会崩溃。函数

在数据库版本升级时, 咱们可能会遇到这样一些状况:spa

须要扩展一个表的字段sqlite

删除掉原来表上某个冗余的字段xml

新建一个表

而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。这里咱们假设用户手机上以前安装的是数据库版本为1的包,升级安装的是数据库版本号为2的包。这时咱们要在数据库版本为2的包在去处理这些升级逻辑。

首先是扩展一个表的字段在onUpgrade中的实现为:

@Override

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

//旧数据库版本为1,才为表pedant添加一个student_name字段

if(oldVersion 

db.execSQL("ALTER TABLE pedant ADD COLUMN student_name text");

}

}

SQLite对ALTER TABLE的支持是有限的,你能够在一个存在表上添加一个字段到末尾,或者是改变表的名称。但若是你想作更复杂的操做,好比删除一个表已有的字段,就要从新建立这个表并完成数据迁移,而不能使用DROP COLUMN这样方便的命令了。详见SQLite Frequently Questions

好比表pedant原来有三个字段a、b、c,如今想删除c字段,那么在onUpgrade中写法以下:

@Override

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

//旧数据库版本为1,删除表pedant的c字段

if(oldVersion 

db.beginTransaction();

try {

db.execSQL("CREATE TEMPORARY TABLE pe_backup (a, b);");

db.execSQL("INSERT INTO pe_backup SELECT a, b FROM pedant;");

db.execSQL("DROP TABLE pedant;");

db.execSQL("CREATE TABLE pedant(a text, b text);");

db.execSQL("INSERT INTO pedant SELECT a, b FROM pe_backup;");

db.execSQL("DROP TABLE pe_backup;");

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

}

}

这样就既完成了对c字段的删除也保留了原来表上的数据。

最后一种状况最简单直接执行CREATE语句就要能够了。

@Override

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

//旧数据库版本为1,建立新表newtb

if(oldVersion 

db.execSQL("CREATE TABLE newtb(a text, b text);");

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐