Android 資料庫公升級解決方案

2021-09-06 22:35:00 字數 3255 閱讀 4148

請考慮如下情況:

在資料庫公升級時,不同版本的資料庫,他們定義的表結構完全可能是不一樣的,比如v1.0的表a有10個column,而在v1.1的表a有12個colum,在公升級時,表a增加了兩列,此時我們應該怎麼做呢。

1,將表a重新命名,改了a_temp。

2,建立新錶a。

3,將表a_temp的資料插入到表a。

下面**列出了更新表的實現,upgradetables,給定表名,更新的列名,就可以實現資料庫表的更新。

/**

* upgrade tables. in this method, the sequence is:

*

* [1] rename the specified table as a temporary table.

* [2] create a new table which name is the specified name.

* [3] insert data into the new created table, data from the temporary table.

* [4] drop the temporary table.

** * @param db the database.

* @param tablename the table name.

* @param columns the columns range, format is "cola, colb, colc, ... coln";

*/ 

protected void upgradetables(sqlitedatabase db, string tablename, string columns) 

catch (sqlexception e) 

catch (exception e) 

finally   } 

我們可以通過sql表得到表的列名。 這裡需要注意的一點,int columnindex = c.getcolumnindex("name"); 這裡根據name去取得index。

protected string getcolumnnames(sqlitedatabase db, string tablename) 

int index = 0; 

columnnames = new string[c.getcount()]; 

for (c.movetofirst(); !c.isafterlast(); c.movetonext())   } 

} catch (exception e) 

finally 

return columnnames;  } 

upgradetables方法應該是在onupgrade方法中去呼叫。

在應用程式開發的過程中,資料庫的公升級是乙個很重要的組成部分(如果用到了資料庫),因為程式可能會有v1.0,v2.0,當使用者安裝新版本的程式後,必須要保證使用者資料不能丟失,對於資料庫設計,如果發生變更(如多新增一張表,表的字段增加或減少等),那麼我們必須想好資料庫的更新策略。

資料庫的版本是乙個整型值,在建立sqliteopenhelper時,會傳入該資料庫的版本,如果傳入的資料庫版本號比資料庫檔案中儲存的版本號大的話,那麼sqliteopenhelper#onupgrade()方法就會被呼叫,我們的公升級應該在該方法中完成。

假如我們開發的程式已經發布了兩個版本:v1.0,v1.2,我們正在開發v1.3。每一版的資料庫版本號分別是18,19,20。

對於這種情況,我們應該如何實現公升級?

使用者的選擇有:                  

1) v1.0 -> v1.3  db 18 -> 20                 

2) v1.1 -> v1.3  db 19 -> 20     

資料庫的每乙個版本所代表的資料庫必須是定義好的,比如說v18的資料庫,它可能只有兩張表tablea和tableb,如果v19要新增一張表tablec,如果v20要修改tablec,那麼每乙個版本所對應的資料庫結構如下:

v18  --->  tablea, tableb

v19  --->  tablea, tableb, tablec

v20  --->  tablea, tableb, tablec (變更)

onupgrade()方法的實現如下:

// pattern for upgrade blocks: 

// 

//    if (upgradeversion == [the database_version you set] - 1) 

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

if (20 == upgradeversion)  

if (upgradeversion != newversion)  } 

從上面的**可以看到,我們在onupgrade()方法中,處理了資料庫版本從18 -> 20的公升級過程,這樣做的話,不論使用者從18 -> 20,還是從19 -> 20,最終程式的資料庫都能公升級到v20所對應的資料庫結構。 

這是很重要的一部分,假設要更新tablec表,我們建議的做法是:      

1) 將tablec重新命名為tablec_temp

sql語句可以這樣寫:alert table tablec rename to tablec_temp;

2) 建立新的tablec表

3) 將資料從tablec_temp中插入到tablec表中

sql語句可以這樣寫:insert into tablec (col1, col2, col3) select (col1, col2, col3) from tablec_temp;               

經過這三步,tablec就完成了更新,同時,也保留了原來表中的資料。 

注意:

在onupgrade()方法中,刪除表時,注意使用事務處理,使得修改能立即反應到資料庫檔案中。      

由於android是使用開源的sqlite3作為其資料庫,所以,我們在開發資料庫模組時,一定要注意sqlite3支援哪些關鍵字,函式等,不是所有的關鍵字,sqlite都是支援的。

sqlite3官方文件:

w3cschool**:

sql語句寫得好壞能直接影響到資料庫的操作。我曾經就遇到過sql語句影響查詢效能,更新3000條記錄,用時30移左右,但在對where條件的字段加上索引後,效能提公升到3~4秒。

Android資料庫公升級解決方案

public class dbopenhelper extends sqliteopenhelper override public void oncreate sqlitedatabase db override public void onupgrade sqlitedatabase db,in...

android 資料庫 公升級設計

很久以前設計的資料庫建立與公升級的方法,此設計避免了公升級的時候需要多處修改的弊端。如下 public class dbadatper 資料庫名 private static final string database name test 建表語句 此部分只是使用者第一次安裝的時候會在oncreat...

Android中資料庫公升級說明

1.幫助文件裡說的 資料庫公升級 是指什麼?你開發了乙個程式,當前是1.0版本。該程式用到了資料庫。到1.1版本時,你在資料庫的某個表中增加了乙個字段。那麼軟體1.0版本用的資料庫在軟體1.1版本就要被公升級了。2.資料庫公升級應該注意什麼?軟體的1.0版本公升級到1.1版本時,老的資料不能丟。那麼...