利用Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法
【專利摘要】本發(fā)明提供了一種基于Android平臺利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,包括、對數(shù)據(jù)庫內(nèi)容進行包裝,根據(jù)應(yīng)用的需要產(chǎn)生對應(yīng)的ViewBean類,所述ViewBean類包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口;創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定;創(chuàng)建自定義Adapter,繼承BaseAdapter,通過所述ViewItem類和所述ViewBean類來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作。使用本發(fā)明,當數(shù)據(jù)庫結(jié)構(gòu)或者布局文件發(fā)生改變,只需要修改Map映射即可,耦合性得到很大降低,設(shè)計的可復(fù)用性也得到很大提高。
【專利說明】利用Adapter實現(xiàn)Vi ew組件與數(shù)據(jù)庫字段自動綁定的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫操作領(lǐng)域,具體地說,涉及一種基于Android平臺利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法。
【背景技術(shù)】
[0002]在Android中,Adapter是連接后端數(shù)據(jù)和前端顯示的適配器接口,是數(shù)據(jù)和UI (View)之間一個重要的紐帶。在常見的View(ListView, GridView)等地方都需要用到 Adapter, Android 提供的三種 Adapter 主要有 ArrayAdapter、SimpleAdapter 以及SimpIeCursorAdapterο
[0003]ArrayAdapter支持泛型操作,最為簡單,只能展示一行字。有時候,列表顯示的信息可能不止一個,而且我們通常還會往列表中添加類似按鈕,圖片的功能,故ArrayAdapter實用性不高。
[0004]SimpleAdapter有最好的擴充性,可以自定義出各種效果。使用SimpleAdapter的數(shù)據(jù)用一般都是HashMap構(gòu)成的List, list的每一節(jié)對應(yīng)ListView的每一行。HashMap的每個鍵值數(shù)據(jù)映射到布局文件中對應(yīng)id的組件上。實際運用時,需要按照不同應(yīng)用構(gòu)建該HashMap,開發(fā)耦合性和重復(fù)性較高。當數(shù)據(jù)源或者view組件變動時,修改變動較大。
[0005]SimpleCursorAdapter可以適用于簡單的純文字型ListView,它需要Cursor的字段和Π的id對應(yīng)起來。如需要實現(xiàn)更復(fù)雜的Π也可以重寫其他方法??梢哉J為是SimpleAdapter對數(shù)據(jù)庫的簡單結(jié)合,可以方便地把數(shù)據(jù)庫的內(nèi)容以列表的形式展示出來。但是也存在與SimpleAdapter同樣的問題。
[0006]列表通常會與數(shù)據(jù)庫的內(nèi)容關(guān)聯(lián)起來,如果構(gòu)建一套機制,能將數(shù)據(jù)庫內(nèi)容的不同字段與View組件ID自動綁定,并將對數(shù)據(jù)庫內(nèi)容的加載,修改,刪除等操作與Activity直接剝離開來,代碼的可重復(fù)使用性大大增強,耦合性大大降低,開發(fā)的難度和工作量會大大降低。
【發(fā)明內(nèi)容】
[0007]有鑒于此,本發(fā)明提供了一種利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,包括:
[0008]對數(shù)據(jù)庫內(nèi)容進行包裝,根據(jù)應(yīng)用的需要產(chǎn)生對應(yīng)的ViewBean類,所述ViewBean類包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口 ;
[0009]創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定;
[0010]創(chuàng)建自定義Adapter,繼承BaseAdapter,通過所述ViewItem類和所述ViewBean類來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作。
[0011]所述對數(shù)據(jù)庫內(nèi)容進行包裝,根據(jù)應(yīng)用的需要產(chǎn)生對應(yīng)的ViewBean類,所述ViewBean類包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口,還包括:[0012]創(chuàng)建接口,提供數(shù)據(jù)庫的各項操作;
[0013]應(yīng)用層將需要顯示的數(shù)據(jù)庫內(nèi)容通過實現(xiàn)該接口實現(xiàn)ViewBean,并提供ViewItem組件需要顯示的數(shù)據(jù)源訪問方式。
[0014]所述創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定,還包括:
[0015]通過遍歷ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map,利用Java的Reflection機制將ViewItem的組件ID與ViewBean的數(shù)據(jù)字段自動綁定。
[0016]所述創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定,還包括:
[0017]實際應(yīng)用的ViewItem通過實現(xiàn)接口,完成ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map構(gòu)造。
[0018]所述創(chuàng)建自定義Adapter,繼承BaseAdapter,通過所述ViewItem類和所述ViewBean類來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作,還包括:
[0019]創(chuàng)建一個ViewBean的列表ViewBeanList,添加相應(yīng)的接口,實現(xiàn)對ViewBeanList的增加、刪除、修改、以及查詢操作。
[0020]當數(shù)據(jù)庫結(jié)構(gòu)或者布局文件發(fā)生改變,只需要修改Map映射即可。
[0021]本發(fā)明具有如下優(yōu)點:系統(tǒng)的耦合性得到很大降低,設(shè)計的可復(fù)用性也得到很大提高;可擴展性增強;將ListView與業(yè)務(wù)層數(shù)據(jù)處理剝離開來,進一步降低耦合性。
【專利附圖】
【附圖說明】
[0022]圖1是本發(fā)明基于Android平臺利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法的實現(xiàn)機制圖。
【具體實施方式】
[0023]下面將參考附圖詳細說明本發(fā)明。
[0024]圖1是本發(fā)明基于Android平臺利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法的實現(xiàn)機制圖。如圖1所示,在Android中,Adapter是用來幫助填充數(shù)據(jù)的中間橋梁,比如通過它將數(shù)據(jù)填充到ListView, GridView, Gallery。而android提供了 幾種 Adapter: ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter,ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter,SpinnerAdapter, WrapperLi stAdapter。根據(jù)數(shù)據(jù)來源形式的不同可以選擇不同的Adapter,比如數(shù)據(jù)來源于一個 Arraylist 就使用 BaseAdapter, SimpleAdapter,而數(shù)據(jù)來源于通過查詢數(shù)據(jù)庫獲得Cursor那就使用SimpleCursorAdapter。BaseAdapter是一個抽象類,通過繼承他并實現(xiàn)較多的方法,具有很高的靈活性。本發(fā)明就是通過繼承BaseAdapter,創(chuàng)建一些通用的自定義Adapter來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作。實現(xiàn)方式如下:
[0025]首先對數(shù)據(jù)庫DataBase內(nèi)容進行包裝,根據(jù)需要產(chǎn)生與其對應(yīng)的ViewBean類。該ViewBean類除了包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口,如用來ViewItem顯示的字段。創(chuàng)建接口 Interface,提供數(shù)據(jù)庫的各項操作。應(yīng)用層將需要顯示的數(shù)據(jù)庫內(nèi)容通過實現(xiàn)該接口實現(xiàn)ViewBean,并提供ViewItem組件需要顯示的數(shù)據(jù)源訪問方式。
[0026]創(chuàng)建抽象ViewItem類,該類實現(xiàn)ViewItem組件ID與ViewBean類數(shù)據(jù)字段的自動綁定。通過遍歷ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map,利用Java的Reflection機制將ViewItem的組件ID與ViewBean的數(shù)據(jù)字段自動綁定。實際應(yīng)用的ViewItem通過實現(xiàn)接口,完成ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map構(gòu)造。
[0027]其中,上述的JAVA反射(reflection)機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。
[0028]Java反射機制主要提供了以下功能:在運行時分析類的能力,判斷任意對象所屬類,類中有哪些方法,有哪些成員變量;在運行時控查對象,比如,只寫一個toStringO方法供所有的類使用;實現(xiàn)通用數(shù)組操作代碼的功能。
[0029]1.得到某個對象的屬性
[0030]lpublic Object getProperty(Object owner, String fieldName)throwsException{
[0031]2Class ownerClass=owner.getClass();
[0032]3
[0033]4Field field=ownerClass.getField(fieldName);
[0034]5
[0035]60bject property=field.get (owner);
[0036]7
[0037]8return property;
[0038]9}
[0039]Class ownerClass=owner.getClass():得到該對象的 Class。
[0040]Field f ield=ownerClass.getField (fieldName):通過 Class 得到類聲明的屬性。
[0041]Object property=field.get (owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,這里會報IllegalAccessException。
[0042]2.得到某個類的靜態(tài)屬性
[0043]lpublic Object getStaticProperty(String className, String fieldName)
[0044]2throws Exception{
[0045]3Class ownerClass=Class.forName(className);
[0046]4
[0047]5Field field=ownerClass.getField(fieldName);
[0048]6
[0049]70bject property=field.get(ownerClass);
[0050]8
[0051]9return property;
[0052]10}[0053]Class ownerClass=Class.forName (className):首先得到這個類的 Class。
[0054]Fieldfield=ownerClass.getField (fieldName):和上面一樣,通過 Class 得到類聲明的屬性。
[0055]Object property=field.get (ownerClass):這里和上面有些不同,因為該屬性是靜態(tài)的,所以直接從類的Class里取。
[0056]3.執(zhí)行某對象的方法
[0057]lpublic Object invokeMethod(Object owner,String methodName, Object[]args)throws Exception{
[0058]2[0059]3Class ownerClass=owner.getClass ();
[0060]4
[0061]5Class [] argsClass=new Class [args.length];
[0062]6
[0063]7for (int i=0,j=args.length; i〈 j ; i++) {
[0064]8argsClass [i]=args [i].getClass ();
[0065]9}
[0066]10
[0067]IlMethod method=ownerClas s.getMethod(methodName, argsClass);
[0068]12
[0069]13return method, invoke (owner, args);
[0070]14}
[0071]Class owner—class=owner.getClass ():首先還是必須得到這個對象的 Class。
[0072]5~9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。
[0073]Method method=ownerClass.getMethod (methodName, argsClass):通過 Method名和參數(shù)的Class數(shù)組得到要執(zhí)行的Method。
[0074]method, invoke (owner, args):執(zhí)行該 Method,invoke 方法的參數(shù)是執(zhí)行這個方法的對象,和參數(shù)數(shù)組。返回值是Object,也既是該方法的返回值。
[0075]4.執(zhí)行某個類的靜態(tài)方法
[0076]lpublic Object invokeStaticMethod(String className, String methodName,
[0077]20b ject [] args) throws Exception {
[0078]3Class ownerClass=Class.forName(className);
[0079]4
[0080]5Class [] argsClass=new Class [args.length];
[0081]6
[0082]7for (int i=0,j=args.length; i〈 j ; i++) {
[0083]8argsClass [i]=args [i].getClass ();
[0084]9}
[0085]10
[0086]I!Method method=ownerClass.getMethod(methodName, argsClass);[0087]12
[0088]13return method, invoke (null, args);
[0089]14}
[0090]基本的原理和實例3相同,不同點是最后一行,invoke的一個參數(shù)是null,因為這是靜態(tài)方法,不需要借助實例運行。
[0091]5.新建實例
[0092]I
[0093]2public Object newlnstance(String className, Object[]args)throwsException{
[0094]3Class newoneClass=Class.forName(className);
[0095]4
[0096]5Class[]argsClass=new Class[args.length];
[0097]6
[0098]7for (int i=0, j=args.length; i〈j ; i++) {
[0099]8argsClass[i]=args[i].getClass ();
[0100]9}
[0101]10
[0102]IlConstructor cons=newoneClass.getConstructor(argsClass);
[0103]12
[0104]13return cons, newlnstance (args);
[0105]14
[0106]15}
[0107]這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實例的方法。如果不需要參數(shù),可以直接使用 newoneClass.newlnstance O 來實現(xiàn)。
[0108]Class newoneClass=Class.forName (className):第一步,得到要構(gòu)造的實例的Class。
[0109]第5?第9行:得到參數(shù)的Class數(shù)組。
[0110]Constructor cons=newoneClass.getConstructor (argsClass):得至丨J構(gòu)造子。
[0111]cons, newlnstance (args):新建實例。
[0112]6.判斷是否為某個類的實例
[0113]lpublic boolean islnstance(Object obj, Class cls){
[0114]2return cls.1slnstance(obj);
[0115]3}
[0116]7.得到數(shù)組中的某個元素
[0117]lpublic Object getByArray(Object array, int index){
[0118]2return Array, get (array, index);
[0119]3}
[0120]其中,反射機制最重要的部分是允許你檢查類的結(jié)構(gòu)。java.lang.reflect包中的三個類Field, Method, Constructor類分別描述類的字段,方法和構(gòu)造器,它們都有一個getName方法,用來返回相應(yīng)條目的名稱。
[0121]自定義Adapter通過ViewItem及ViewBean顯示信息,按鈕等,adapter實現(xiàn)修改,刪除,刷新等操作,從而將應(yīng)用于Activity與ListView分離開來。通過指定ViewItem和ViewBean完成顯示。同時,倉Il建一個ViewBean的列表ViewBeanList,添加相應(yīng)的接口,實現(xiàn)對ViewBeanList的增刪改查等操作。因為ViewBean提供了接口實現(xiàn)與其對應(yīng)的數(shù)據(jù)庫操作,故完成ViewBeanList更新之前需要先完成與之對應(yīng)的數(shù)據(jù)庫的更新。這樣,應(yīng)用的業(yè)務(wù)層就與Activity及View剝離。
[0122]本發(fā)明的方法具有的優(yōu)勢的說明:通過Reflection機制將ViewBean和ViewItem組件ID自動綁定之后,當數(shù)據(jù)庫結(jié)構(gòu)或者布局文件發(fā)生改變,只需要修改Map映射即可,耦合性得到很大降低,設(shè)計的可復(fù)用性也得到很大提高。
[0123]可擴展性增強,只需要添加新的布局文件,配置好Map映射,即可在ListView中顯示信息,以及各種功能按鈕。
[0124]通過自定義Adapter對ViewBeanList的控制,將ListView與業(yè)務(wù)層數(shù)據(jù)處理剝離開來,進一步降低耦合性。如業(yè)務(wù)處理發(fā)生變化,只需要修改相應(yīng)的Adapter即可。
[0125]以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在被發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,包括: 對數(shù)據(jù)庫內(nèi)容進行包裝,根據(jù)應(yīng)用的需要產(chǎn)生對應(yīng)的ViewBean類,所述ViewBean類包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口 ; 創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定; 創(chuàng)建自定義Adapter,繼承BaseAdapter,通過所述ViewItem類和所述ViewBean類來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作。
2.根據(jù)權(quán)利要求1所述的利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,所述對數(shù)據(jù)庫內(nèi)容進行包裝,根據(jù)應(yīng)用的需要產(chǎn)生對應(yīng)的ViewBean類,所述ViewBean類包含數(shù)據(jù)庫的常用方法,還對外提供獲取數(shù)據(jù)庫內(nèi)容的接口,還包括: 創(chuàng)建接口,提供數(shù)據(jù)庫的各項操作; 應(yīng)用層將需要顯示的數(shù)據(jù)庫內(nèi)容通過實現(xiàn)該接口實現(xiàn)ViewBean,并提供ViewItem組件需要顯示的數(shù)據(jù)源訪問方式。
3.根據(jù)權(quán)利要求1所述的利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,所述創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定,還包括: 通過遍歷ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map,利用Java的Reflection機制將ViewItem的組件ID與ViewBean的數(shù)據(jù)字段自動綁定。
4.根據(jù)權(quán)利要求1所述的利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,所述創(chuàng)建抽象ViewItem類,所述ViewItem類實現(xiàn)ViewItem組件ID與所述ViewBean類數(shù)據(jù)字段的自動綁定,還包括: 實際應(yīng)用的ViewItem通過實現(xiàn)接口,完成ViewItem組件ID與ViewBean數(shù)據(jù)對應(yīng)關(guān)系的Map構(gòu)造。
5.根據(jù)權(quán)利要求1所述的利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,所述創(chuàng)建自定義Adapter,繼承BaseAdapter,通過所述ViewItem類和所述ViewBean類來實現(xiàn)數(shù)據(jù)庫內(nèi)容的顯示和操作,還包括: 創(chuàng)建一個ViewBean的列表ViewBeanList,添加相應(yīng)的接口,實現(xiàn)對ViewBeanList的增加、刪除、修改、以及查詢操作。
6.根據(jù)權(quán)利要求1-4任一項所述的利用自定義Adapter實現(xiàn)View組件與數(shù)據(jù)庫字段自動綁定的方法,其特征在于,當數(shù)據(jù)庫結(jié)構(gòu)或者布局文件發(fā)生改變,只需要修改Map映射即可。
【文檔編號】G06F17/30GK103902634SQ201210590268
【公開日】2014年7月2日 申請日期:2012年12月30日 優(yōu)先權(quán)日:2012年12月30日
【發(fā)明者】陳懿, 陳皓, 張偉, 江洪, 付立庫, 徐琳華, 張健 申請人:航天信息股份有限公司