王巖 施一飛

【摘 要】安卓操作系統內嵌的SQLite數據庫適用于在移動設備保存少量的數據,但目前業界一直缺少適合SQLite數據庫的映射框架,能公開源代碼的則更為罕見。本文就開發效率提升和容錯問題等方面,描述了一款SQLite對象關系映射框架的設計實現思路。并以實際案例,對比使用前后的效率提升結果。
【關鍵詞】對象關系映射;SQLite;框架;安卓
中圖分類號: TP277 文獻標識碼: A文章編號: 2095-2457(2019)30-0051-002
DOI:10.19694/j.cnki.issn2095-2457.2019.30.024
了解安卓系統的人都知道,SQLite是一款開源的輕量級關系型數據庫,安卓系統原生內建了SQLite的實現,以文件存儲的方式在移動設備中存儲數據。而現在針對SQLite數據庫的對象關系映射,開發了一款新的框架,解決了SQLite在編程時的效率和容錯問題,它的名稱是ChopinLite。這款框架既可作為安卓系統開發的實用工具,也可作為本科或高職專業移動開發課程的內容。
根據以往的體驗,在使用Java語言進行各類數據庫的相關操作時,會經常用到Hibernate等框架;而且在Java語言編程教學中,一般也會把Hibernate框架作為教學內容。當體驗過使用Hibernate框架給編程帶來的便利后,會發現進入安卓開發時,對于SQLite數據庫并未有類似框架的支持。又因為精簡內存的需要,安卓系統不適合使用較復雜的大型框架,只能使用輕量級的框架。而目前能支持SQLite數據庫的第三方框架種類欠豐富,功能欠完善,操作也欠優化。以目前較為流行的OrmLite框架為例,其在連接時需要手動定義輔助類;定義映射及關聯關系時所用的標識符過長且不夠明確;操作時需要手動處理異常。這些不足之處引發了進一步開發更為簡單實用的新框架的需求,因此本框架應運而生。本框架的優勢在于:
(1)彌補不足:本框架可以彌補目前SQLite數據庫的第三方框架的各種不足,實現搭建便捷、功能定位適當、操作優化的目的。
(2)填補空白:目前國內還沒有公開發行的類似框架,主要都是公司內部的產權技術,因此本框架在某種程度上可以填補國內空白。
(3)輔助教學:本框架一方面能夠滿足實際生產中的簡單安卓項目的快速開發,同時又可以作為課堂教學的輔助工具,甚至其自身的開發過程也可以作為教學內容,使學生能夠快速掌握對象關系映射的原理和方法。
本框架的設計理念是精簡和高效,其大致來自桌面平臺的Hibernate框架,但進行了大幅度的優化,同時摒棄了其他類似框架的各種不足之處,給使用者提供了極大的便利。使用者無須編寫任何配置文件,也基本無須派生其他多余的操作類和接口。無論是在搭建數據表結構還是在操作實體時,使用者都只需使用框架中已經實現的各種操作方法,無須二次開發。
圖1
本框架核心組件包含連接和初始化(OpenHelper)、實體模板(Entity)、實體標注(annotations)、實體操作(Dao)和輔助工具(utils)。這些核心組件建立在安卓SQLite數據庫的操作接口之上,并為安卓APP的開發提供支持。
在這些核心組件中,OpenHelper可以進行數據庫的初始化連接,進而根據已定義的實體及其關聯關系,自動生成數據表及其字段,也可以對數據庫進行備份和重建;而Entity則是用來定義上述實體的模板,封裝了包含實體標識(ID)在內的各個字段的Java Bean操作,這些字段可通過annotation進行標注,如標注為表、列、多對一關聯、多對多關聯等;在這之后,可以使用Dao進行各種實體操作,如添加、修改、刪除實體,或以各種指定條件查詢實體等。在使用上述核心組件時,輔助工具也是不可或缺的。使用本框架的輔助工具可以定義模糊查詢條件、組合查詢條件和聚合函數,可以保存查詢結果,也可以更加便捷地定義日期和時間。
設計這些核心組件時使用了泛型、內部類和反射原理,使框架盡可能輕量化,結構盡可能簡化,操作盡可能簡潔。在此基礎上,本框架通過內部算法,將使用者的意圖轉化為對應的SQL語句,并將語句的執行結果重新封裝為使用者所需的實體或數值。
使用本框架的步驟非常簡單:先定義實體類,再進行數據表結構的搭建,最后進行實體操作。
實體類只需從實體模板派生,并對每個字段標注映射關系和關聯關系即可;在搭建數據表結構時,只需將事先定義好的若干實體類作為參數,調用初始化或備份方法即可,而且還可以選擇是否在操作過程中顯示自動生成的SQL語句;在實體操作時,只需調用簡單的方法即可實例化操作類,進而添加、刪除或更新實體,以及根據各種條件查詢實體、計算聚合函數等。
本框架在安全性方面,也盡可能與可擴展性平衡,盡量隱藏無須使用者擴展的資源,使使用方式趨于規范統一。
下面以一個常見的用戶注冊和登錄功能的案例來說明本框架的使用方法和原理:
如果采用MVC結構,則由service(控制層)實現用戶注冊和登錄的功能邏輯,dao(模型層)實現實體數據的操作。本案例旨在對比采用和不采用本框架的區別,從而說明采用本框架將大幅提高開發效率。
不使用框架編寫Service實現類的login方法:
使用框架編寫后的版本
由此可見,采用本框架后,類結構和代碼更簡練,條理性更強。