一,前言
沒有採用android自身提供的那一套資料庫操作方式。而是想對sqlite資料庫檔案有更全面的控制,包括隨時匯出資料庫檔案修改表結構,增刪資料等等。這樣一來雖然在開放中得到不少便利,但是也帶來了資料庫公升級的一些問題。
後來不得已採用了一種方案,可以解決問題,現將方案的全部實現細節記錄下來。最後也會提出一些我認為有問題的地方。
二,資料庫檔案拷貝
程式不負責資料庫的建立,sqlite資料庫檔案是在外部建立好的。程式啟動階段拷貝進sd卡。以達到對資料庫結構的全面控制。
public void copydbfile() else catch (namenotfoundexception e)
}} else catch (exception e)
};}.start();
}} }
其中有幾個要點:
1、檢測資料庫檔案是否已經存在。不存在則從raw資料夾複製資料庫檔案拷貝至sd卡中指定目錄。
2、資料庫版本是根據應用的versioncode相同。拷貝資料庫後,會把當前versioncode寫入資料庫的表中。
versioncode在androidmanifest.xml檔案中。在這種方案下,實際上是由versioncode控制資料庫版本,versionname控制程式版本。
3、sd卡指定目錄已經存在資料庫檔案的情況,則讀取其中儲存的資料庫版本號,與versioncode對比,從而確定是否需要公升級資料庫。**如下:
public boolean needupdate()
try catch (namenotfoundexception e)
}
三,公升級資料庫
包括三個步驟:
1、從程式中拷貝新資料庫檔案至sd卡指定目錄,命名為temp.db。
string temp = sysconst.db_folder + "temp.db";
boolean s1 = fileoperator.write2sdcard(context, r.raw.scpip_collection,temp);
2、分別獲取兩個資料來源。
//原資料庫檔案
basedao sd = new basedao();
//新資料庫檔案
basedao nd = new basedao(temp);
對於sqlite資料庫來講,資料來源就是資料庫檔案。basedao是自己封裝的,關鍵在於要可以配置不同的資料來源
private string dbpath;
public basedao() {}
public basedao(string dbpath)
public sqlitedatabase getdb()
public sqlitedatabase getdb(string dbpath)
這樣就可以根據檔案,獲取不同的sqlitedatabase 物件。
3、傳輸資料
把原資料庫中的資料查詢出來,插入到新資料庫中。
public void transfer(basedao sd,basedao nd,classcls) throws exception
這裡有兩個要點,
第一,使用了自行封裝的orm。
第二,使用了sqlite批量插入,增加寫入效率。**如下:
@override
public void batchinsert(listdatas) throws exception else
int size = datas.size();
try else
c = dba.rawquery(sql, null);
if (c != null ? (c.getcount() == 1) : false)
if(c != null)
// sqlargs sa = helper.prepareinsert();
// dba.execsql(sa.getsql(), sa.getargs());
dba.insert(helper.gettablename(), "", helper.getinsertcontent());
}dba.settransactionsuccessful();
dba.endtransaction();
} finally
}
4、寫入當前資料庫版本,即從程式獲得的versioncode。
5、刪除原資料庫檔案,重新命名temp.db。
完整過程如下:
public void updatedb() throws exception
//此時更新資料庫版本
} }
至此,整個資料庫公升級完成。在保留原資料的基礎上,獲取了新的資料庫結構。
四,問題
1,需要保留的原資料與新錶結構不符。這個可以在程式中控制,建立新的or對映。
2,效率問題,如果需要保留的資料量非常大的情況下,是否會出現問題。這個是亟待解決的,目前我還沒有想到解決辦法。
五,總結
這個方案針對的情況是外部建立資料庫檔案,程式啟動時從apk包將資料庫檔案拷貝進sd卡,從而達到對資料庫檔案的完全控制。
方案步驟:
1,檢測是否需要公升級資料庫檔案。資料庫檔案版本是由versioncode控制。程式公升級時,如果需要公升級資料庫,則要將versioncode+1。
2,將新資料庫檔案(存在於apk中),寫入sd卡。
3,轉移資料。
4,刪除原資料庫檔案,重新命名新資料庫檔案。
5,向新資料庫寫入當前資料庫版本。
android客戶端 AsyncTask的使用
在開發android移動客戶端的時候往往要使用多執行緒來進行操作,我們通常會將耗時的操作放在單獨的執行緒執行,避免其占用主線程而給使用者帶來不好的使用者體驗。但是在子執行緒中無法去操作主線程 ui 執行緒 在子執行緒中操作ui執行緒會出現錯誤。因此android提供了乙個類handler來在子執行緒...
android 客戶端 Cookie處理
android 客戶端 cookie處理 cookie,有時也用其複數形式cookies,指某些 為了辨別使用者身份 進行session跟蹤而儲存在使用者本地終端上的資料 通常經過加密 cookie最早是網景公司的前 雇員lou montulli在1993年3月的發明。cookie是由伺服器端生成,...
瘦客戶端 胖客戶端 智慧型客戶端
胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...