加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

数据库版本如何单独升级,并且将原有数据迁移过去

发布时间:2019-07-18 16:33:01 所属栏目:MySql教程 来源:Android架构师
导读:副标题#e# 在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级、数据的迁移、增加行的字段等。比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库。 我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在
副标题[/!--empirenews.page--]

在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级、数据的迁移、增加行的字段等。比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库。

数据库版本如何单独升级,并且将原有数据迁移过去

​我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在数据库中增加了一个字段。因此V1.0的数据库在V1.1版本需要升级,V1.0版本升级到V1.1时原来数据库中的数据不能丢失,

​那么在V1.1中就要有地方能够检测出来版本的差异,并且把V1.0软件的数据库升级到V1.1软件能够使用的数据库。也就是说,要在V1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。 应用中怎么检测数据库需要升级呢? SQLiteOpenHelper 类中有一个方法

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

​当我们创建对象的时候如果传入的版本号大于之前的版本号,该方法就会被调用,通过判断oldVersion 和 newVersion 就可以决定如何升级数据库。在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

数据库升级

SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。并且只能在表的末尾添加字段,比如,为Orders 表中添加一个字段:”ALTER TABLE Order ADDCOLUMN Country”

代码如下:

  1. public class OrderDBHelper extends SQLiteOpenHelper { 
  2. private static final int DB_VERSION = 1; 
  3. private static final String DB_NAME = "Test.db"; 
  4. public static final String TABLE_NAME = "Orders"; 
  5. public OrderDBHelper(Context context, int version) { 
  6.  super(context, DB_NAME, null, version); 
  7. @Override 
  8. public void onCreate(SQLiteDatabase db) { 
  9.  String sql = "create table if not exists " + TABLE_NAME + " (Id integer primary key, " + 
  10.  "CustomName text, OrderPrice integer)"; 
  11.  db.execSQL(sql); 
  12. @Override 
  13. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
  14.  Log.e("owen", "DB onUpgrade"); 
  15.  if (newVersion == 2) { 
  16.  db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN Country"); 
  17.  Cursor cr = db.rawQuery("select * from " + TABLE_NAME, null); 
  18.  while (cr.moveToNext()) { 
  19.  String name = cr.getString(cr.getColumnIndex("CustomName")); 
  20.  ContentValues values = new ContentValues(); 
  21.  values.put("CustomName", name); 
  22.  values.put("Country", "China"); 
  23.  db.update(TABLE_NAME, values, "CustomName=?", new String[] {name}); 
  24.  } 
  25.  cr.close(); 
  26.  } 
  27. OrderDBHelper orderDBHelper = new OrderDBHelper(this, 2); 
  28. SQLiteDatabase db = orderDBHelper.getWritableDatabase(); 
  29. ContentValues contentValues = new ContentValues(); 
  30. contentValues.put("OrderPrice", 100); 
  31. contentValues.put("CustomName", "OwenChan"); 
  32. db.insert(OrderDBHelper.TABLE_NAME, null, contentValues); 
  33. Log.e("owen", "create finish"); 
  34. Cursor cr = db.rawQuery("select * from " + OrderDBHelper.TABLE_NAME , null); 
  35. while (cr.moveToNext()) { 
  36.  String name = cr.getString(cr.getColumnIndex("CustomName")); 
  37.  Log.e("owen", "name:" + name); 
  38.  String country = cr.getString(cr.getColumnIndex("Country")); 
  39.  Log.e("owen", "country:" + country); 
  40. cr.close(); 
  41. db.close(); 

数据库的迁移

可以分一下几个步骤迁移数据库

1、 将表名改成临时表

ALTER TABLE Order RENAME TO _Order;

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读