在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

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

111次阅读
没有评论

共计 5022 个字符,预计需要花费 13 分钟才能阅读完成。

本篇文章给大家分享的是有关数据库版本如何单独升级并将原有数据迁移过去,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

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

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

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

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

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

数据库升级

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

代码如下:

public class OrderDBHelper extends SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String DB_NAME =  Test.db  public static final String TABLE_NAME =  Orders  public OrderDBHelper(Context context, int version) { super(context, DB_NAME, null, version); } @Override public void onCreate(SQLiteDatabase db) { String sql =  create table if not exists   + TABLE_NAME +   (Id integer primary key,   +  CustomName text, OrderPrice integer)  db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.e( owen ,  DB onUpgrade  if (newVersion == 2) { db.execSQL( ALTER TABLE   + TABLE_NAME +   ADD COLUMN Country  Cursor cr = db.rawQuery( select * from   + TABLE_NAME, null); while (cr.moveToNext()) { String name = cr.getString(cr.getColumnIndex( CustomName)); ContentValues values = new ContentValues(); values.put( CustomName , name); values.put(Country ,  China  db.update(TABLE_NAME, values,  CustomName=? , new String[] {name}); } cr.close(); } } OrderDBHelper orderDBHelper = new OrderDBHelper(this, 2); SQLiteDatabase db = orderDBHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(OrderPrice , 100); contentValues.put(CustomName ,  OwenChan  db.insert(OrderDBHelper.TABLE_NAME, null, contentValues); Log.e(owen ,  create finish  Cursor cr = db.rawQuery( select * from   + OrderDBHelper.TABLE_NAME , null); while (cr.moveToNext()) { String name = cr.getString(cr.getColumnIndex( CustomName)); Log.e(owen ,  name:  + name); String country = cr.getString(cr.getColumnIndex( Country)); Log.e(owen ,  country:  + country); } cr.close(); db.close();

数据库的迁移

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

1、将表名改成临时表

ALTER TABLE Order RENAME TO _Order;

2、创建新表

CREATETABLE Test(Id VARCHAR(32) PRIMARY KEY ,CustomName VARCHAR(32) NOTNULL , Country VARCHAR(16) NOTNULL);

3、导入数据

INSERTINTO Order SELECT id, “”, Age FROM _Order;

4、删除临时表

DROPTABLE _Order;

通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会因为升级而流失。  当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。

实现代码如下:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion == 2) { char str =   db.beginTransaction(); db.execSQL(ALTER TABLE Order RENAME TO _Order  db.execSQL( CREATE TABLE Order(Id integer primary key autoincrement , CustomName VARCHAR(20) NOT NULL,  +   Country VARCHAR(32) NOT NULL , OrderPrice VARCHAR(16) NOT NULL)  db.execSQL(INSERT INTO Order SELECT Id,   + str + str +  , CustomName, OrderPrice FROM _Order  db.setTransactionSuccessful(); db.endTransaction(); } }

多个数据库版本的升级

假如我们开发的程序已经发布了两个版本:V1.0,V2.0,我们正在开发 V3.0。版本号分别是 1,2,3。对于这种情况,我们应该如何实现升级?   用户的选择有:

V1.0 – V3.0 DB 1 – 2

V2.0 – V3.0 DB 2 – 3

数据库的每一个版本所代表的数据库必须是定义好的,比如说 V1.0 的数据库,它可能只有两张表 TableA 和 TableB,如果 V2.0 要添加一张表 TableC,如果 V3.0 要修改 TableC,数据库结构如下:

V1.0  mdash;  TableA, TableB V1.2  mdash;  TableA, TableB, TableC V1.3  mdash;  TableA, TableB, TableC (Modify)

代码如下:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (1 == oldVersion) { String sql =  Create table C....  db.execSQL(sql); oldVersion = 2; } if (2 == oldVersion) { //modify C oldVersion = 3; } }

导入已有数据库:

/** * Created by Owen Chan * On 2017-09-26. */ public class DbManager { public static final String PACKAGE_NAME =  com.example.sql  public static final String DB_NAME =  table.db  public static final String DB_PATH =  /data/data/  + PACKAGE_NAME; private Context mContext; public DbManager(Context mContext) { this.mContext = mContext; } public SQLiteDatabase openDataBase() { return SQLiteDatabase.openOrCreateDatabase(DB_PATH +  /  + DB_NAME, null); } public void importDB() { File file = new File(DB_PATH +  /  + DB_NAME); if (!file.exists()) { try { FileOutputStream out = new FileOutputStream(file); int buffer = 1024; InputStream in = mContext.getResources().openRawResource(R.raw.xxxx); byte[] bts = new byte[buffer]; int lenght; while ((lenght = in.read(bts))   0) { out.write(bts, 0, bts.length); } out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } } }

调用方式:

@Override protected void onResume() { super.onResume(); DbManager dbManager = new DbManager(this); dbManager.importDB(); SQLiteDatabase db = dbManager.openDataBase(); db.execSQL(do what you want  }

以上就是数据库版本如何单独升级并将原有数据迁移过去,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计5022字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 久久九九精品视频 | 国产综合色香蕉精品五月婷 | 大帝av在线一区二区三区 | 国产日韩一区二区三区在线观看 | 久草高清在线 | 在线看免费毛片 | 久久久久精彩视频 | 国产精品自产拍在线观看2019 | 综合久久99久久99播放 | 极品少妇被啪到呻吟喷水 | 男女爽爽无遮挡午夜视频在线观看 | 久久精品aⅴ无码中文字字幕重口 | 国产亚洲欧美另类久久久 | 国产成人羞羞电影网站在线观看 | 狠狠人妻久久久久久综合蜜桃 | 成人影院vs一区二区 | 中国成人在线视频 | 一级电影免费看 | 九九久久精品视频 | 天天干天天曰 | 久久久久久久国产a∨ | 国产精品美女久久久久网 | 视频在线观看一区 | 成人综合亚洲欧美一区h | 主播蜜汁丝袜 精品自拍 | 国产av激情无码久久 | 亚洲色图片区 | 亚洲看片网站 | 国产成+人欧美+综合在线观看 | 欧美成人猛交69 | 香蕉免费一区二区三区 | 国产破外女真实出血视频 | 久久国产精品免费观看 | 无码国产伦一区二区三区视频 | 色多多免费视频观看区一区 | 欧美日韩第一区 | 97国产在线观看 | 看黄网站在线播放 | 青青视频一区 | 久草热8精品视频在线观看 久草热久草热线频97精品 | 久久精选视频 |