Android電話本數據查詢總結

該文總結下工作當中維護的聯繫人模塊中的數據查詢流程。該流程在很多系統APP上都類似,瞭解這個過程還是很有必要的。

在Android應用框架中一般都會劃分爲三層:數據層、數據訪問層和業務層。數據層基本都是用sqlite來存儲數據,數據訪問層是借用四大組件中的內容提供器來實現,業務層就是各個應用,比如電話本。三層結構如下圖所示:

這裏將詳細總結下電話本對數據庫的查詢流程。

1、創建數據庫

當系統啓動,所有服務都準備好之後,ContactsUpgradeReceiver類將接受到重啓廣播,在廣播接受類中會去獲取聯繫人數據的實例,在獲取實例當中會去創建數據庫和表,如下圖所示:

2、內容提供器的創建

聯繫人當中用到最多的數據訪問接口都是在ContactsProvider2中創建的。它提供了一些增刪改查的接口,這些接口其實就是借用前面創建的數據庫進行操作。

3、業務層數據查詢流程

當數據層和數據訪問層都準備好之後,業務層纔可以調用接口。下面給出一個聯繫人主界面查詢數據的大致流程。
聯繫人的主界面一般會分爲幾個碎片,每個碎片代表一個界面,在碎片的父類當中會實現數據的異步查詢。
舉例:DefaultContactBrowseListFragment
它的父類ContactEntryListFragment封裝了大部分的工作。包括創建適配器、加載頁面、創建查詢加載器和查詢結束。
子類一般會根據業務的需求來進行各種定製。它的工作有創建適配器、加載頁面、創建查詢加載器。其實就是對父類實現類的覆蓋。在適配器中還會對查詢加載器進行查詢配置。適配器也有跟碎片一樣的實現模式,大部分操作都在父類DefaultContactListAdapter中實現,用戶也可以繼承它來進行各種查詢定製。比如聯繫人對SIM卡的過濾、對沒有分組成員的過濾等等。具體的流程圖如下所示:

查詢完會返回一個Cursor對象,適配器會用這個對象進行數據和頁面控件的綁定。

在業務層中會根據loader機制,最後會調用內容提供器註冊的uri,進行異步查詢,如下:

        final Cursor cursor = getActivity().getContentResolver().query(Contacts.CONTENT_URI,
                LOOKUP_PROJECTION, Contacts.IN_VISIBLE_GROUP + "!=0", null, null);

接着會根據binder機制走到ContactsProvider2中的查詢接口進行查詢。在queryLocal方法中會匹配不同的uri進行表的映射和查詢配置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章