Android資料庫更新並保留原來資料的實現

2021-10-01 15:56:06 字數 3839 閱讀 4517

第一步:

我們公升級資料庫時第一步一般是公升級資料庫版本號:我之前使用的資料庫版本號是6,所以我現在公升級的版本號是:

public static final int schema_version = 7;

第二步:

定義在原來的表上要新增的新字段address和age,所以新建立user表

private static final string create_user = "create table user(_id integer primary key,name text not null,*** text,logindate integer,address text,age integer);";

修改原來的user表名改為_temp_user臨時表名

private static final string create_temp_user = "alter table user rename to _temp_user";

把臨時備份表中的資料copy到新建立的資料庫表中

private static final string insert_data = "insert into user select *,'' from _temp_user";

刪除臨時備份表

private static final string drop_user = "drop table _temp_user";

第三步:

在andoird的sqliteopenhelper類中有乙個onupgrade方法中:

@override

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

}

ok!完結!

詳細描述請看下面這篇文章:

andoird的sqliteopenhelper類中有乙個onupgrade方法。幫助文件中只是說當資料庫公升級時該方法被觸發。經過實踐,解決了我一連串的疑問:

1. 幫助文件裡說的「資料庫公升級」是指什麼?

你開發了乙個程式,當前是1.0版本。該程式用到了資料庫。到1.1版本時,你在資料庫的某個表中增加了乙個字段。那麼軟體1.0版本用的資料庫在軟體1.1版本就要被公升級了。

資料庫公升級應該注意什麼?

軟體的1.0版本公升級到1.1版本時,老的資料不能丟。那麼在1.1版本的程式中就要有地方能夠檢測出來新的軟體版本與老的資料庫不相容,並且能夠有辦法把1.0軟體的資料庫公升級到1.1軟體能夠使用的資料庫。換句話說,要在1.0軟體的資料庫的那個表中增加那個字段,並賦予這個字段預設值。

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

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

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

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

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

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

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

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

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

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

1. alter table subscription add column activation blob;

2. alter table subscription add column key blob;

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

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應用程式更新的時候如果資料庫修改了字段需要更新資料庫,並且保留原來的資料庫資料:

這是原有的資料庫表

create_book = 「create table book(bookid integer primarykey,bookname text);」;

然後我們增加乙個字段:

create_book = 「create table book(bookid integer primarykey,bookname text,bookcontent text);」;

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

create_temp_book = 「alter table book rename to _temp_book」;

然後把備份表中的資料copy到新建立的資料庫表中

insert_data = 「insert into book select *,』 』 from _temp_book」;(注意』 『是為新加的字段插入預設值的必須加上,否則就會出錯)。

然後我們把備份表乾掉就行啦。

drop_book = 「drop table _temp_book」;

然後把資料庫的版本後修改一下,再次建立資料庫操作物件的時候就會自動更新(注:更新的時候第乙個建立的運算元據的物件必須是可寫的,也就是通過這個方法getwritabledatabase()獲取的資料庫操作物件)

然後在onupgrade()方法中執行上述sql語句就ok了

public class dbservice extends sqliteopenhelper

@override

public void oncreate(sqlitedatabase db)

@override

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

}

Android資料庫更新並保留原來資料的實現

andoird的sqliteopenhelper類中有乙個onupgrade方法。幫助文件中只是說當資料庫公升級時該方法被觸發。經過實踐,解決了我一連串的疑問 1.幫助文件裡說的 資料庫公升級 是指什麼?你開發了乙個程式,當前是1.0版本。該程式用到了資料庫。到1.1版本時,你在資料庫的某個表中增加...

Android資料庫更新並保留原來資料的實現

package cn.view.database import android.content.context import android.database.sqlite.sqlitedatabase import android.database.sqlite.sqliteopenhelper ...

清理oracle資料庫下的資料重複,並保留其一

select from b2bx where create date in to date 2017 12 11 08 22 16 yyyy mm dd hh24 mi ss to date 2017 12 11 08 22 17 yyyy mm dd hh24 mi ss to date 2017...