王 巖,施一飛,王明珠
(吉利學(xué)院,四川 成都 641423)
在安卓系統(tǒng)中,其采用的是一款輕量化數(shù)據(jù)庫SQLite,編程時如果單純使用SQLite 原生的操作語句編寫,那么在效率和容錯方面會表現(xiàn)一般,如可以開發(fā)一款映射插件來服務(wù)和SQLite 數(shù)據(jù)庫的溝通,就會在一定程度上提升編寫程序的效率。經(jīng)過對國內(nèi)多個安卓程序產(chǎn)品項目的調(diào)研,發(fā)現(xiàn)安卓映射插件在應(yīng)用中均有著不同的程度,當(dāng)該程序?qū)τ诤蠖说臏贤坎皇呛艽髸r,可能就沒有必要安裝相關(guān)映射插件,當(dāng)然絕大多數(shù)的程序比較復(fù)雜,還要考慮和PC 平臺及Web 平臺功能的一致性[1],所以大多數(shù)都安裝有公開的或者自行研發(fā)的映射插件,方便對于數(shù)據(jù)庫的溝通,達(dá)到自身程序運(yùn)行目的。
安卓系統(tǒng)的開發(fā)主要基于Java 語言,以往在使用Java 語言進(jìn)行各類數(shù)據(jù)庫的相關(guān)操作時,會經(jīng)常用到諸如Hibernate 或MyBatis 等框架[2]。但對于SQLite 數(shù)據(jù)庫,并未有類似的框架,并且安卓系統(tǒng)不適合使用較復(fù)雜的大型框架,只能使用一些輕量級的框架。如OrmLite 框架等,但目前能支持 SQLite 數(shù)據(jù)庫的第三方框架,其種類欠豐富,功能欠完善,操作也欠優(yōu)化[3]。
本次開發(fā)是在原有的ChopinLite 1.0 的版本上進(jìn)行功能優(yōu)化以及完善,之前的版本在添加刪除上不能夠進(jìn)行批量添加刪除,只能一次一次的進(jìn)行重復(fù)操作,且占用系統(tǒng)內(nèi)存,浪費(fèi)大量時間,操作不夠便捷,由此本次開發(fā)偏向批量操作等功能,著重開發(fā)以下5 個方面,本文就(4)(5)項的原理會加以重點(diǎn)說明。
(1)實體批量增加功能:用戶在添加大量實體時,會浪費(fèi)很多時間,因此為了節(jié)約用戶的時間和提升用戶的工作效率,在以前的基礎(chǔ)上對其進(jìn)行了優(yōu)化,實現(xiàn)在數(shù)據(jù)庫中實體批量添加數(shù)據(jù)的功能。可以更加高效的操作數(shù)據(jù)庫中的內(nèi)容,節(jié)約了大量的操作的時間。
(2)實體批量刪除功能:刪除數(shù)據(jù)的語句非常簡單,但是大量的刪除操作會消耗大部分時間,因此實體批量刪除操作應(yīng)運(yùn)而生。該功能在1.0 的基礎(chǔ)上進(jìn)行優(yōu)化,實現(xiàn)在數(shù)據(jù)庫中批量刪除數(shù)據(jù)的操作。
(3)實體批量修改功能:增刪改作為數(shù)據(jù)庫的基礎(chǔ)操作,修改用戶數(shù)據(jù)也是經(jīng)常用到的功能之一。而修改數(shù)據(jù)的操作并不像添加和刪除實體那樣簡單,所需要的代碼極其煩瑣。因此在數(shù)據(jù)庫中實體批量修改就成了2.0 版本的重頭戲。
(4)實體批量覆蓋功能:覆蓋操作是把本地數(shù)據(jù)上傳到數(shù)據(jù)庫,與批量刷新操作不同,批量覆蓋是對數(shù)據(jù)庫已有的實體做更新操作,沒有的做添加操作,以本地數(shù)據(jù)為準(zhǔn)。
(5)實體批量刷新功能:刷新實體同樣是數(shù)據(jù)庫經(jīng)常進(jìn)行的操作。單個實體進(jìn)行刷新和批量實體刷新有所不同,需要先以數(shù)據(jù)庫為基準(zhǔn)進(jìn)行判斷,當(dāng)實體存在于數(shù)據(jù)庫時,進(jìn)行選擇操作,當(dāng)實體并未在數(shù)據(jù)庫中查詢到時,進(jìn)行添加操作。
本次開發(fā)的框架摒棄了其他類似框架的不足之處,使用者無須編寫配置文件,僅需使用框架中已經(jīng)實現(xiàn)的各種操作方法,無須二次開發(fā)。該軟件的特性在于以非循環(huán)的方式實現(xiàn)增刪改查,更新和覆蓋的批量操作。
在實現(xiàn)單個實體添加的基礎(chǔ)上,運(yùn)用全新的結(jié)構(gòu)化查詢語言(Tructured Query Language,SQL)語句實現(xiàn)實體批量添加,節(jié)約用戶操作時間,提升用戶的工作效率,更高效的操作數(shù)據(jù)庫的內(nèi)容,使用 數(shù)據(jù)訪問對象(Data Access Object,DAO)調(diào)用AddBatch 方法,可以批量添加實體。添加實體后,實體會自動獲得身份標(biāo)識號(Identity Document,ID),成為持久態(tài)。
刪除與批量添加的原理相同,使用獨(dú)特的 SQL 語句,實現(xiàn)一次操作,批量刪除的結(jié)果。解放用戶繁雜的重復(fù)操作的同時減少計算機(jī)運(yùn)行的壓力,節(jié)約資源,實現(xiàn)可持續(xù)發(fā)展。
批量修改功能在一定程度上簡化修改的煩瑣過程,內(nèi)部程序僅采用一條 SQL 語句,達(dá)到批量修改的目的。使用 DAO 對象調(diào)用 EditBatch 方法,可以批量修改實體。(1)查詢再修改,FindAll 得到集合。(2)設(shè)置需要修改的實體的各類屬性。(3)最后修改集合或集合中的個例。
刷新實體的方法和其他功能有所不同,主要是調(diào)用了其他的方法。
刷新是以反射再賦值的方式實現(xiàn)了實體的批量刷新,主要是通過反射拿取數(shù)據(jù)庫里的值,賦值回本地。將數(shù)據(jù)庫與本地數(shù)據(jù)兩者ID 做對比,若兩者中存在相同ID,則把數(shù)據(jù)庫中的數(shù)據(jù)下載到本地。若數(shù)據(jù)庫中沒有該ID,則將本地數(shù)據(jù)添加到數(shù)據(jù)庫中。
使用 DAO 對象調(diào)用 AttachAndRefreshBatch 方法,可以更新實體,結(jié)果以數(shù)據(jù)庫為準(zhǔn),使用實例如下:
覆蓋的操作與刷新大同小異,本軟件的覆蓋操作以本地數(shù)據(jù)為準(zhǔn),將數(shù)據(jù)上傳到數(shù)據(jù)庫,與批量刷新操作不同的是,批量覆蓋是對數(shù)據(jù)庫已有的實體做更新操作,沒有的做添加操作。類似于上傳的原理,通過這樣的方式更新數(shù)據(jù)庫,使之兩邊數(shù)據(jù)保持一致。
安卓使用Replace into 語句,輕松實現(xiàn)了預(yù)期功能,SQLite 數(shù)據(jù)庫是通過直接覆蓋的方式進(jìn)行操作的。批量覆蓋操作就是將數(shù)據(jù)庫與本地數(shù)據(jù)兩者ID 做對比,與刷新操作所不同的是:若兩者中存在相同ID,則把數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行更新操作。若數(shù)據(jù)庫中沒有該ID,則直接進(jìn)行添加操作。使用 DAO 對象調(diào)用AttachAndOverrideBatch 方法,可以更新實體,結(jié)果以數(shù)據(jù)庫為準(zhǔn),
使用實例如下:
安卓平臺相較于其他平臺,安卓具有開放性的優(yōu)勢,這就意味安卓擁有更多的開發(fā)者,更多的用戶和應(yīng)用。用戶和應(yīng)用的多樣性會對插件的需求大量增加,可以讓插件得到快速的發(fā)展。安卓還是一個開源平臺,可以提供種類繁多的函數(shù)庫和有用的工具,減少開發(fā)者的工作量,同時還能增加創(chuàng)新性和軟件的交互性。目前安卓平臺的相關(guān)實體映射的插件較少,增加了所研究的映射插件的實用性。
在插件設(shè)計之初,并沒有考慮到用戶所使用的數(shù)據(jù)庫的多樣性的問題,只考慮了SQLite 數(shù)據(jù)庫。但實際上,一款優(yōu)秀的插件則應(yīng)該適應(yīng)眾多的軟件,而不能專用化。所以,在后續(xù)的開發(fā)中,我們要讓插件的適用范圍更廣,例如在MySQL、Oracle、SQL Server 等數(shù)據(jù)庫中都可以使用??梢栽贘ava SE 平臺使用Java 數(shù)據(jù)庫連接(Java Database Connect,JDBC) 工具向其他數(shù)據(jù)庫進(jìn)行移植,以此來滿足在多種數(shù)據(jù)庫中均可進(jìn)行使用的目的。
綜上所述,本次開發(fā)增加了批量操作的多種功能,既節(jié)省了時間,又使代碼更加簡練,操作更方便,節(jié)約了程序的運(yùn)行內(nèi)存,解放了計算機(jī)的運(yùn)行壓力,為后續(xù)實體映射軟件的發(fā)展指明了新方向。