今天得空,寫一篇文章,是關於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...