溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中怎么升級SQLite數(shù)據(jù)庫版本

發(fā)布時間:2021-06-29 15:03:30 來源:億速云 閱讀:144 作者:Leah 欄目:移動開發(fā)

這篇文章給大家介紹Android中怎么升級SQLite數(shù)據(jù)庫版本,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Android SQLite數(shù)據(jù)庫版本升級的管理實現(xiàn)

我們知道在SQLiteOpenHelper的構造方法:

super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

中最后一個參數(shù)表示數(shù)據(jù)庫的版本號.當新的版本號大于當前的version時會調用方法:

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

所以我們的重點是在該方法中實現(xiàn)SQLite數(shù)據(jù)庫版本升級的管理

當我們項目剛開始的時候第一版SQLiteOpenHelper是這樣寫的:

package cc.database; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
/** 
 * Demo描述: 
 * SQLite數(shù)據(jù)庫版本升級的管理實現(xiàn) 
 * 
 * 參考資料: 
 * http://blog.csdn.net/guolin_blog 
 * Thank you very much 
 */ 
public class DataBaseOpenHelper extends SQLiteOpenHelper { 
  private final static String DATABASE_NAME="test.db"; 
  private static DataBaseOpenHelper mDataBaseOpenHelper; 
   
  public static final String CREATE_PERSON= 
  "create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))"; 
   
  public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) { 
    super(context, name, factory, version); 
  } 
 
   
  //注意: 
  //將DataBaseOpenHelper寫成單例的. 
  //否則當在一個for循環(huán)中頻繁調用openHelper.getWritableDatabase()時 
  //會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關閉操作 
  static synchronized DataBaseOpenHelper getDBInstance(Context context) { 
    if (mDataBaseOpenHelper == null) { 
      mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,1); 
    } 
    return mDataBaseOpenHelper; 
  }  
   
  @Override 
  public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_PERSON); 
  } 
 
  @Override 
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     
  } 
 
}

在幾天之后根據(jù)項目需求,需要添加一張student表,于是DataBaseOpenHelper就出現(xiàn)了第二版:

package cc.database; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
 
public class DataBaseOpenHelper extends SQLiteOpenHelper { 
  private final static String DATABASE_NAME="test.db"; 
  private static DataBaseOpenHelper mDataBaseOpenHelper; 
   
  public static final String CREATE_PERSON= 
  "create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))"; 
   
  public static final String CREATE_STUDENT= 
  "create table student(studentid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))"; 
   
  public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) { 
    super(context, name, factory, version); 
  } 
 
   
  //注意: 
  //將DataBaseOpenHelper寫成單例的. 
  //否則當在一個for循環(huán)中頻繁調用openHelper.getWritableDatabase()時 
  //會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關閉操作 
  static synchronized DataBaseOpenHelper getDBInstance(Context context) { 
    if (mDataBaseOpenHelper == null) { 
      //改動1 
      mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,2); 
    } 
    return mDataBaseOpenHelper; 
  }  
   
  @Override 
  public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_PERSON); 
    //改動2 
    db.execSQL(CREATE_STUDENT); 
  } 
 
  @Override 
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //改動3 
    switch (oldVersion) { 
     
    case 1: 
    db.execSQL(CREATE_STUDENT); 
 
    default: 
    } 
  } 
 
}

較版本一在版本二中有三處修改的地方:

1 版本號變成了2

2 在onCreate()方法中添加了代碼db.execSQL(CREATE_STUDENT);創(chuàng)建student表

   因為有的用戶根本就沒有第一版本的APP,直接從市場下載了第二版本的App。所以當然會執(zhí)行onCreate()而不會執(zhí)行onUpgrade()

3 在onUpgrade()做了處理:當oldVersion為1時調用db.execSQL(CREATE_STUDENT);創(chuàng)建student表
   因為有的用戶手機上本來就有第一版本的APP,所以在App升級到第二版本時會執(zhí)行onUpgrade(),不會執(zhí)行onCreate()

通過這樣的處理使得不同的情況下使用第二版APP時都會生成student表

又過了一個月,根據(jù)項目變更,需要給person表添加一個字段genderid,于是DataBaseOpenHelper就出現(xiàn)了第三版:

package cc.database; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
 
public class DataBaseOpenHelper extends SQLiteOpenHelper { 
  private final static String DATABASE_NAME="test.db"; 
  private static DataBaseOpenHelper mDataBaseOpenHelper; 
   
  //改動1 
  public static final String CREATE_PERSON= 
  "create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12)),genderid integer)"; 
   
  public static final String ALTER_PERSON="alter table person add column genderid integer"; 
   
  public static final String CREATE_STUDENT= 
  "create table student(studentid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))"; 
   
  public DataBaseOpenHelper(Context context,String name,CursorFactory factory,int version) { 
    super(context, name, factory, version); 
  } 
 
   
  //注意: 
  //將DataBaseOpenHelper寫成單例的. 
  //否則當在一個for循環(huán)中頻繁調用openHelper.getWritableDatabase()時 
  //會報錯,提示數(shù)據(jù)庫沒有執(zhí)行關閉操作 
  static synchronized DataBaseOpenHelper getDBInstance(Context context) { 
    if (mDataBaseOpenHelper == null) { 
      //改動2 
      mDataBaseOpenHelper = new DataBaseOpenHelper(context,DATABASE_NAME,null,3); 
    } 
    return mDataBaseOpenHelper; 
  }  
   
  @Override 
  public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_PERSON); 
    db.execSQL(CREATE_STUDENT); 
  } 
 
  @Override 
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    switch (oldVersion) { 
     
    case 1: 
    db.execSQL(CREATE_STUDENT); 
     
    //改動3 
    case 2: 
    db.execSQL(ALTER_PERSON); 
 
    default: 
    } 
  } 
 
}

較版本二在版本三中有三處修改的地方:

1 改變了CREATE_PERSON語句,在改語句中增加了一個字段genderid 

  和前面的描述類似,有的用戶第一次安裝該APP時就直接下載了第三版

2 修改版本號為3

   應對了用戶從第一版本或者第二版本升級到第三版本的情況(見下分析)

3 在onUpgrade()方法中)做了處理:當oldVersion為2時調用 db.execSQL(ALTER_PERSON);修改person表,增加genderid字段

   應對了用戶從第二版本升級到第三版本的情況(見下分析)

注意一個問題:為什么這里的switch語句在每個case中沒有break???

這是為了保證跨版本升級的時候每次數(shù)據(jù)庫的升級都會執(zhí)行到。

比如從第二版升級到第三版本,那么case 2會被執(zhí)行。

比如從第一版直接升級到第三版本,那么case 1肯定會被調用,由于沒有break所以會穿透switch語句又執(zhí)行case 2語句繼續(xù)升級,從而保證了數(shù)據(jù)的所有版本中的升級都會被執(zhí)行到。

關于Android中怎么升級SQLite數(shù)據(jù)庫版本就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI