對於android開發同窗來講,數據庫相關操做是咱們平常操做之一,相應的數據庫的升級操做就必不可少了。這裏我總結下數據庫升級時須要注意的事項。javascript
Android中數據庫操做的核心類是SqliteOpenHelper,這個類有兩個方法,onCreate和onUpgrade。onCreate方法只會調用一次,onUpgrade方法會在版本號增長以後觸發。java
數據庫升級的操做過程當中,咱們須要處理的狀況有兩種,第一種是數據庫從低版本升級上來的,第二種是新安裝app的用戶。android
每次數據庫須要升級時,咱們須要將新版本的修改同步到兩個地方: 一個是onCreate方法中,這裏確保新安裝app的用戶可使用到最新的數據庫,因此這裏建立數據庫的語句應該是能夠直接建立最新版本數據庫的語句。 另外一個是onUpgrade方法中,在這裏咱們須要確保低版本用戶在升級到最新版時,可以將數據庫更新到最新,這裏咱們就須要將各個版本間的差別用代碼體現出來。sql
代碼以下:數據庫
// 表的名字
const val sqlite_name = "MySqliteHelper.db"
internal class MySqliteHelper(context: Context, version: Int) : SQLiteOpenHelper(context, sqlite_name, null, version) {
val TAG = "MySqliteHelper"
// 建立語句
val sqlCreate = "create table Test (" +
"id integer primary key autoincrement, " +
"author text, " +
"price real, " +
"pages integer, " +
"name text, " +
"ver2 text, " +
"ver3 text, " +
"ver4 text, " +
"ver5 text)"
override fun onCreate(db: SQLiteDatabase?) {
Log.e(TAG, "onCreate")
db?.execSQL(sqlCreate)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
Log.e(TAG, "onUpgrade oldVersion:$oldVersion newVersion:$newVersion")
// 1 升級到 2
if (oldVersion < 2) {
Log.e(TAG, "onUpgrade 1~2")
}
// 2 升級到 3
if (oldVersion < 3) {
Log.e(TAG, "onUpgrade 2~3")
}
// 3 升級到 4
if (oldVersion < 4) {
Log.e(TAG, "onUpgrade 3~4")
}
// 4 升級到 5
if (oldVersion < 5) {
Log.e(TAG, "onUpgrade 4~5")
}
}
}
複製代碼
二、使用SqliteOpenHelper的子類建立數據庫:app
class SqliteUpgradeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sqlite_upgrade)
var sqliteHelper = MySqliteHelper(this, 1);
var db = sqliteHelper.writableDatabase
db.execSQL("insert into Test (name, author, pages, price) values(?, ?, ?, ?)",
arrayOf("tiny's book", "tiny", "600", "20.9"))
db.execSQL("insert into Test (name, author, pages, price) values(?, ?, ?, ?)",
arrayOf("tongtong", "tong", "250", "9.99"))
}
}
複製代碼
三、這裏咱們先設置數據庫的版本爲1,而後看下執行結果: log中有以下輸出:代表咱們的數據庫建立好了。ide
E/MySqliteHelper: onCreate
複製代碼
而後咱們查看下建立好的數據庫,以下所示,能夠看到數據庫中的數據字段確實如咱們指望的那樣。this
五、修改版本號,模擬從低版本升級到高版本: 這裏咱們直接將version字段的值修改成5,表明着用戶是從第1版數據庫的app直接升級到第5版的數據庫。這種狀況下,onUpgrade方法中的全部代碼都會順序執行,咱們運行代碼驗證下:spa
E/MySqliteHelper: onUpgrade oldVersion:1 newVersion:5
onUpgrade 1~2
onUpgrade 2~3
onUpgrade 3~4
onUpgrade 4~5
複製代碼
能夠看到,輸出的Log跟咱們指望的徹底相同。code
總結: 使用SqliteOpenHelper進行數據庫升級操做時,onCreate方法中須要時刻保持最新的業務語句,由於這個方法只有新安裝的用戶纔會執行。另外,在onUpgrade方法中,須要保留每次升級時新版本與上版本的差別。