資料庫更新

2021-07-10 16:53:10 字數 3783 閱讀 7541

做android應用,不可避免的會與sqlite打交道。隨著應用的不斷公升級,原有的資料庫結構可能已經不再適應新的功能,這時候,就需要對sqlite資料庫的結構進行公升級了。 sqlite提供了alter table命令,允許使用者重新命名或新增新的字段到已有表中,但是不能從表中刪除字段。

並且只能在表的末尾新增字段,比如,為 subscription新增兩個字段:

1alter

table

subscription 

addcolumn

activation blob;

2alter

table

subscription 

addcolumn

keyblob;

另外,如果遇到複雜的修改操作,比如在修改的同時,需要進行資料的轉移,那麼可以採取在乙個事務中執行如下語句來實現修改表的需求。

1. 將表名改為臨時表

alter

table

subscription rename 

to__temp__subscription;

2. 建立新錶

create

table

subscription (orderid 

varchar(32

) primary

key,username 

varchar(32

) not

null

,productid 

varchar(16

) not

null

);3. 匯入資料  

insert

into

subscription 

select

orderid, 「」, productid 

from

__temp__subscription;

或者  

insert

into

subscription() 

select

orderid, 「」, productid 

from

__temp__subscription;

* 注意 雙引號」」 是用來補充原來不存在的資料的

4. 刪除臨時表  

drop

table

__temp__subscription;

通過以上四個步驟,就可以完成舊資料庫結構向新資料庫結構的遷移,並且其中還可以保證資料不會應為公升級而流失。

當然,如果遇到減少欄位的情況,也可以通過建立臨時表的方式來實現。

在android應用程式需要公升級時,如果之前的資料庫表結構發生了變化或者新新增了表,就需要對資料庫進行公升級,並保留原來的資料庫資料。

程式如何知道資料庫需要公升級?

sqliteopenhelper類的建構函式有乙個引數是int version,它的意思就是指資料庫版本號。比如在軟體1.0版本中,我們使用sqliteopenhelper訪問資料庫時,該引數為1,那麼資料庫版本號1就會寫在我們的資料庫中。

到了1.1版本,我們的資料庫需要發生變化,那麼我們1.1版本的程式中就要使用乙個大於1的整數來構造sqliteopenhelper類,用於訪問新的資料庫,比如2。

當我們的1.1新程式讀取1.0版本的老資料庫時,就發現老資料庫裡儲存的資料庫版本是1,而我們新程式訪問它時填的版本號為2,系統就知道資料庫需要公升級。

何時觸發資料庫公升級?如何公升級?

當系統在構造sqliteopenhelper類的物件時,如果發現版本號不一樣,就會自動呼叫onupgrade函式,讓你在這裡對資料庫進行公升級。根據上述場景,在這個函式中把老版本資料庫的相應表中增加字段,並給每條記錄增加預設值即可。

新版本號和老版本號都會作為onupgrade函式的引數傳進來,便於開發者知道資料庫應該從哪個版本公升級到哪個版本。

公升級完成後,資料庫會自動儲存最新的版本號為當前資料庫版本號。

下面舉例寫出具體過程:

如果我上乙個版本的資料庫表結構沒發生變化,但是新增了兩張表,而且之前有一張表中預設有4條資料,現在新版本預設有11條資料,那麼該怎麼操作呢,假設表a發生了變化,並且新建了表b、c

1.首先我們需要把原來的資料庫表重新命名一下

public

static

final string temp_sql_create_table_subscribe = "alter table "

+ a + " rename to temp_a";

原來的表結構是:

private

static

final string sql_create_table_subscribe = "create table if not exists "

+a + "(id integer primary key autoincrement,code text not null,name text,username text)";

2.然後把備份表temp_a中的資料copy到新建立的資料庫表a中,這個表a沒發生結構上的變化

public

static

final string insert_subscribe = "select 'insert into a (code,name,username,tablename)

values ('''||code||''','''||name||''',''cnki'','''||tablename||'''')' as insertsql from temp_a";

3.此時臨時表中的資料已經全部複製到了表a中,但是我之前的表a中有四條預設的資料,使用者可能刪了,可能又增加了新的資料,那我不管使用者什麼操作,我都把這4條刪除掉,然後重新新增一次,這樣就保證了之前的四條資料還在新的資料表中。

這是我之前的四條資料,我先找出來:

public

static

final string arrwhereact =;

4.刪除備份表

public

static

final string delete_temp_subscribe = "delete from temp_a ";

public

static

final string drop_temp_subscribe = "drop table if exists temp_a";

5.然後把資料庫版本號改為比之前高的版本號,在onupgrade方法中執行上述語句就行,具體如下:

@override

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

//將臨時表中的資料放入表a 

cursor cursor = db.rawquery(insert_subscribe, null);

if (cursor.movetofirst()) while (cursor.movetonext());

} cursor.close();

//將臨時表刪除掉

db.execsql(drop_temp_subscribe);

break;

default:

break;

} } }

為什麼要在方法裡寫for迴圈,主要是考慮到誇版本公升級,比如有的使用者一直不公升級版本,資料庫版本號一直是1,而客戶端最新版本其實對應的資料庫版本已經是4了,那麼我中途可能對資料庫做了很多修改,通過這個for迴圈,可以迭代公升級,不會發生錯誤。

資料庫更新

region 將資訊存入資料庫store the information to the sql int userid convert.toint32 session userid oledbconnection cn new oledbconnection strcn string sqlcmd u...

資料庫 資料更新

資料庫更新操作有三種 在表中新增若干行資料 修改表中的資料和刪除表中的若干行資料。sql中有三類相應的語句,分別是插入資料 insert 修改資料 update 刪除資料 delete insert values 插入單行或多行元組資料 例 向資料庫mysql test的表customers中插入這...

DataSet更新資料庫

思路是這樣的 先查詢,繫結資料集 要更新的資料集需要設定為當前模組的變數 等你在datagridview修改資料後繼續進行下面的操作 然後是再在其他的事件中提交修改 比如 你在某個窗體內定義 sqlconnection conn dataset ds new dataset sqlcommand c...