国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android SQLite數據庫版本升級的管理實現

2019-10-22 18:28:33
字體:
來源:轉載
供稿:網友

Android SQLite數據庫版本升級的管理實現

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

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

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

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 

所以我們的重點是在該方法中實現SQLite數據庫版本升級的管理

當我們項目剛開始的時候第一版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數據庫版本升級的管理實現  *  * 參考資料:  * 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循環中頻繁調用openHelper.getWritableDatabase()時   //會報錯,提示數據庫沒有執行關閉操作   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) {        }  } 

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

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循環中頻繁調用openHelper.getWritableDatabase()時   //會報錯,提示數據庫沒有執行關閉操作   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);創建student表

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

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

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

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

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循環中頻繁調用openHelper.getWritableDatabase()時   //會報錯,提示數據庫沒有執行關閉操作   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???

這是為了保證跨版本升級的時候每次數據庫的升級都會執行到。

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

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

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 藁城市| 增城市| 潜江市| 凤山市| 晋中市| 禄丰县| 疏勒县| 舟曲县| 丽水市| 和静县| 炉霍县| 时尚| 策勒县| 玉环县| 镶黄旗| 大名县| 福安市| 泾源县| 日土县| 东明县| 盖州市| 吉隆县| 唐海县| 蚌埠市| 河间市| 南岸区| 镇远县| 建湖县| 沐川县| 杭州市| 自治县| 博野县| 金坛市| 淳化县| 兴业县| 普格县| 浦北县| 长汀县| 宁远县| 嘉定区| 河西区|