Android 資料庫高階之資料庫公升級連帶保留資料

2021-06-27 12:48:34 字數 3654 閱讀 6545

今天得空,寫一篇文章,是關於android資料庫的。每個應用都需要對資料進行儲存和更改,當然一些簡單的資料,資料比較少,就不必用資料庫存數,可以用android提供的sharedpreferences,這個相對資料庫訪問資料來說消耗的資源更少,而且儲存方式更容易讓人理解。android使用的是開源的、與作業系統無關的sql資料庫—sqlite。它是一款輕量級資料庫,它的設計目標是嵌式的,占用資源同樣也非常的低。

我們建立資料庫的時候一般都是繼承

sqliteopenhelper

,該類用於對資料庫版本進行管理,該類是乙個抽象類,必須繼承它才能使用,為了實現對資料庫版本進行管理,sqliteopenhelper類有兩種重要的方法,分別是oncreate(sqlitedatabase db) 和  onupgrade(sqlitedatabase db, int oldversion, int newversion),當呼叫sqliteopenhelper的getwritabledatabase()或者getreadabledatabase()方法(ps:

getwritabledatabase()和getreadabledatabase()方法都可以獲取乙個用於運算元據庫的sqlitedatabase例項,但getwritabledatabase()方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用的是getwritabledatabase()方法就會出錯,

getreadabledatabase()方法先以讀寫方式開啟資料庫,如果資料庫的磁碟空間滿了,就會開啟失敗,

當開啟失敗後會繼續嘗試以唯讀方式開啟資料庫),獲取用於運算元據庫的sqlitedatabase例項的時候,如果資料庫不存在,android系統會自動生成乙個資料庫,接著呼叫oncreate()方法,

public dbhelper extends

sqliteopenhelper

在資料庫公升級的時候,會執行onupgrade()方法,

@override

public void onupgrade(sqlitedatabase db, int oldversion, int newversion)

資料庫降級的時候呼叫,

@override

public void ondowngrade(sqlitedatabase db, int oldversion, int newversion) }

下面我們就來針對資料庫公升級舉個例子,正常上線的資料庫是v1.0,有8個column,但是現在版本公升級,也要公升級資料庫v1.1,要追加2個column,現在我們該怎麼辦?問題既然來了,那我們就給出解決方案。首先第一種方案:(適合複雜的資料表操作)

這是我們原有的資料庫表:

creat_card="create table if not exists " + card + "(" + cardexportcolumns.date + " char(16)," + cardexportcolumns.file_name + " char(32)," + cardexportcolumns.file_uri + " char(50)" + ");"

現在我要在這裡面加乙個time的標籤,

creat_card="create table if not exists " 

+ card + "(" + cardexportcolumns.date + " char(16)," 

+ cardexportcolumns.file_name + " char(32)," 

+ cardexportcolumns.file_uri + " char(50)" + cardexportcolumns.create_time +" long" + ");"

大概思路:

1.將表名重新命名

2.建立新錶

3.將資料插入新錶

4.刪除臨時表

現在我們用**具體實現下:

create_temp_card = "alter table card rename to temp_card";//將表重新命名

creat_card="create table if not exists " 

+ card + "(" + cardexportcolumns.date + " char(16)," 

+ cardexportcolumns.file_name + " char(32),"

+ cardexportcolumns.file_uri + " char(50)" + cardexportcolumns.create_time +" long" + ");"//建立新錶

insert_data_into = "insert into card select *,"" from temp_card";//(注意' '是為新加的字段插入預設值的必須加上,否則就會出錯)

drop_temp = "drop table temp_card"; // 刪除臨時表

public class dbbase extends sqliteopenhelper

@override

public void onupgrade(sqlitedatabase db, int oldversion, int newversion) }

} 這樣我們就完成了新加入一些字段,公升級資料庫,並保留之前的資料,這種方式比較推薦有複雜的操作,比如在修改的同時,還要進行資料的轉移,或者刪除某些字段,如果資料庫表中資料比較多的情況下,建議大家採取事務操作,在乙個事務中執行。

下面我再給大家提供乙個方法,就是獲得舊資料的字段值,

// 獲取公升級前表中的字段

protected string getcolumnnames(sqlitedatabase db, string tablename)}}

catch (exception e)

finally}

return sb.tostring();}}

資料庫公升級的邏輯,我覺得是很重要的,產品在開發之前就要想好公升級策略,這樣才能保證資料不會丟失。

比如現在我們發布了兩個版本:v1.0,v1.1現在準備發布v1.2版本,在onupgrade中我們判斷的到是1.2和1.1,分別對應的版本號是10,11,12但是可能還存在v1.0的使用者,所以我們就要做好v1.0的使用者公升級,資料庫的公升級策略還是很重要的。

public void onupgrade(sqlitedatabase db, int oldversion, int newversion)

if (20 == upgradeversion)

if (upgradeversion != newversion)

}第二種解決方案(有一定的條件約束):

當然新增的時候也可以用sqlite提供的alter欄位,來增加字段或者更新字段,但是不能刪除column。增加字段,比如"alter table " + card_table_card + " add column " + cardcolumns.ownershipopt + " integer  default -1",但是必須滿足一下限制:

字段不能有主鍵或唯一約束。

字段不能有這些預設值:current_time, current_date 或current_timestamp

若定義了not null約束,則字段必須有乙個非空的預設值。

而且這樣新增字段的話,新字段只能新增到表的末尾,而且只能增加有限子集,而且對一些複雜的操作,比如要更改又要移動資料,效率比較低,比較麻煩。對於複雜的操作還是推薦用重新命名表的方式。

資料庫高階之資料庫事務(ACID)

事務 transaction 是併發控制的基本單位。所謂事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉帳工作 從乙個帳號扣款並使另乙個帳號增款,這兩個操作要麼都執行,要麼都不執行。事務的 acid 特性是由關聯式資料庫管理系統 rdbms,資料庫系...

Android資料庫之SQLite

在android作業系統中使用的是sqlite資料庫,我們借助sqliteopenhelper這個sqlitedatabase的工具類來建立資料庫。首先我們需要建立乙個 sqliteopenhelper的子類 class databasehelper extends sqliteopenhelper...

mysql資料庫高階 mysql資料庫高階

一 索引 索引,是資料庫中專門用於幫助使用者快速查詢資料的一種資料結構。類似於字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置,然後直接獲取即可。分類 普通索引 唯一索引 全文索引 組合索引 主鍵索引 1 普通索引 普通索引僅有乙個功能 加速查詢 建立表時建立索引 create tabl...