androidsqlit数据库升级,添加字段
由于Android的数据库SQLite是⾃带的,故随着我们的应⽤App升级,相对应的数据库⾥⾯的内容发⽣改变时也要随之升级,升级的时候希望的是之前保存的数据不丢失的情况下对其进⾏升级。这时就要⽤到Andoird的SQLiteOpenHelper类中有⼀个onUpgrade⽅法,当前数据库版本变化时就触发该⽅法对数据库进⾏升级。
1. 数据库升级是指什么?
你开发了⼀个程序,当前是1.0版本。该程序⽤到了数据库。到1.1版本时,你在数据库的某个表中增加了⼀个字段。那么软件1.0版本⽤的数据库在软件1.1版本就要被升级了。
2. 数据库升级应该注意什么?
软件的1.0版本升级到1.1版本时,⽼的数据不能丢。那么在1.1版本的程序中就要有 地⽅能够检测出来新的软件版本与⽼的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使⽤的数据库。换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。
3. 程序如何知道数据库需要升级?
SQLiteOpenHelper类的构造函数有⼀个参数是int version,它的意思就是指数据库版本号。⽐如在软件1.0版本中,我们使⽤SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发⽣变化,那么我们1.1版本的程序中就要使⽤⼀个⼤于1的整数来构造SQLiteOpenHelper类,⽤于访问新的数据库,⽐如2。
当我们的1.1新程序读取1.0版本的⽼数据库时,就发现⽼数据库⾥存储的数据库版本是1,⽽我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
4. 何时触发数据库升级?如何升级?
当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不⼀样,就会⾃动调⽤onUpgrade函数,让你在这⾥对数据库进⾏升级。根据上述场景,在这个函数中把⽼版本数据库的相应表中增加字段,并给每条记录增加默认值即可。新版本号和⽼版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。升级完成后,数据库会⾃动存储最新的版本号为当前数据库版本号。
SQLiteOpenHelper是SQLiteDatabase的⼀个帮助类,⽤来管理数据库的创建和版本的更新。⼀般是建⽴⼀个类继承它,并实现它的onCreate和onUpgrade⽅法。
以下⾯的代码为例:
第⼀次创建数据库,版本号为1:
private static CopyOfDatabaseHelper DB_HELPER = null;
sql软件长什么样public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) { if (DB_HELPER == null) {
DB_HELPER = new CopyOfDatabaseHelper(context);
}
return DB_HELPER;
}
public CopyOfDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 数据库创建时执⾏
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + DataColumn.Student.TABLE_NAME + " ("
+ DataColumn.Student._ID
+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT " + ")";
}
/**
* 数据库版本发⽣变化
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
第⼀次数据库升级,版本号为2,添加⼀个Age字段:
private static CopyOfDatabaseHelper DB_HELPER = null;
public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) {
if (DB_HELPER == null) {
DB_HELPER = new CopyOfDatabaseHelper(context);
}
return DB_HELPER;
}
public CopyOfDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 数据库创建时执⾏
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table "+DataColumn.Student.TABLE_NAME
+ " ("
+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
+ ")";
}
/**
* 数据库版本发⽣变化
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT "; db.execSQL(sql);
}
}
第⼆次升级数据库,版本号为3,添加⼀个成绩字段:
private static CopyOfDatabaseHelper DB_HELPER = null;
public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) {
if (DB_HELPER == null) {
DB_HELPER = new CopyOfDatabaseHelper(context);
}
return DB_HELPER;
}
public CopyOfDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 数据库创建时执⾏
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table "+DataColumn.Student.TABLE_NAME
+ " ("
+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
+ ")";
}
/**
* 数据库版本发⽣变化
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion < 2){//当数据库版本⼩于版本2时,就要升级下⾯的所有字段
String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
}
//当前版本为2时就只升级下⾯的字段
String sql1 = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_SCORE+" TEXT ";
}
}
升级数据库时我们就要考虑全⾯,若不加上判断语句判断版本号,若之前2版本⽤户没有升级就直接升级到3,就会漏掉字段,故升级时所有的情况都应该考虑进去。
Android应⽤程序更新的时候如果数据库修改了字段需要更新数据库,并且保留原来的数据库数据:
这是原有的数据库表
CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";
然后我们增加⼀个字段:
CREATE_BOOK = "create table book(bookId integer primarykey,bookName text,bookContent text);";
⾸先我们需要把原来的数据库表重命名⼀下
CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
然后把备份表中的数据copy到新创建的数据库表中
INSERT_DATA = "insert into book select *,' ' from _temp_book";(注意' '是为新加的字段插⼊默认值的必须加上,否则就会出错)。
然后我们把备份表⼲掉就⾏啦。
DROP_BOOK = "drop table _temp_book";
然后把数据库的版本后修改⼀下,再次创建数据库操作对象的时候就会⾃动更新(注:更新的时候第⼀个创建的操作数据的对象必须是可写的,也就是通过这个⽅法getWritableDatabase()获取的数据库操作对象)
然后在onUpgrade()⽅法中执⾏上述sql语句就OK了
public class DBservice extends SQLiteOpenHelper{
private String CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";
private String CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
private String INSERT_DATA = "insert into book select *,'' from _temp_book";
private String DROP_BOOK = "drop table _temp_book";
public DBservice(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 2:
db.beginTransaction();
db.setTransactionSuccessful();
break;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论