邢立國,褚龍現(xiàn)
(平頂山學院 河南 平頂山 467000)
目前大部分應用程序的主要功能都圍繞數(shù)據(jù)處理進行設計,如何高效安全地進行數(shù)據(jù)存儲和訪問成為各類應用設計中重點關注的問題[1]。存儲應用程序中的數(shù)據(jù)一般有兩種方式,分別是數(shù)據(jù)文件和數(shù)據(jù)庫。數(shù)據(jù)文件存儲數(shù)據(jù)方式簡潔,但是修改和查詢數(shù)據(jù)困難,所以主要用來存儲類型簡單且少量數(shù)據(jù);數(shù)據(jù)庫需要借助專門的管理系統(tǒng)進行管理,但是對數(shù)據(jù)進行增加、刪除、修改和查詢時非常便利,所以可以用來存儲需要經(jīng)常訪問的大量數(shù)據(jù)[2]。在Android應用程序中為了存儲和訪問數(shù)據(jù)也采用上述兩種方式,其中數(shù)據(jù)文件存儲可以選擇XML文件或基本文件[3],而數(shù)據(jù)庫則采用Android內置的SQLite進行管理。本文在分析Android中數(shù)據(jù)存儲方式的基礎上,提出了每種存儲方式下不同數(shù)據(jù)的訪問技術實現(xiàn)方法,并總結各種訪問技術的應用場景。
Android是基于Linux內核的開放式操作系統(tǒng),允許用戶開發(fā)應用程序并自由發(fā)布[4]。Android平臺由四層框架構成,最底層是Linux內核層,提供各種驅動;第二層是庫和Android運行時,包含C/C++庫、Dalvike虛擬機和Java語言特定函數(shù),用來實現(xiàn)線程管理和內存管理等;第三層是應用程序框架層,是為應用程序提供框架服務的API;最上層是應用程序層,大多是使用Java開發(fā)的核心應用和用戶自定義的應用[5]。
目前,Android系統(tǒng)主要應用在智能手機和手持平板電腦中,基于Android的應用程序也越來越多。一個Android項目需要保存數(shù)據(jù)時,可以將數(shù)據(jù)文件或數(shù)據(jù)庫文件保存在res文件夾下,發(fā)布格式是一個經(jīng)過數(shù)字簽名的.apk文件包[6]。
Android應用中可以把數(shù)據(jù)保存到數(shù)據(jù)文件中,也可以保存到SQLite管理的數(shù)據(jù)庫中[7]。保存方式不同,訪問數(shù)據(jù)時應用技術也不相同。
Android系統(tǒng)中的文件讀寫主要分為3類:一是基本文件讀寫,二是簡單共享文件讀寫,三是XML文件讀寫。
1)基本文件讀寫
為了保存數(shù)據(jù),Android允許應用程序將數(shù)據(jù)保存在指定位置的文件中。常見的有兩種位置:設備內部存儲器和SD卡。
①內部存儲器文件讀寫
當應用程序讀寫內部存儲器上文件時,要求文件保存在“/data/data/<package name>/files” 目錄中, 且通過簡化函數(shù)openFileOutput()和 openFileInput()進行操作。
其中寫文件提供了四種模式,分別是私有模式,只能被創(chuàng)建文件的程序或具有相同UID的程序訪問;追加模式,在文件結尾處添加新數(shù)據(jù);全局讀,允許任何程序讀取私有文件;全局寫,允許任何程序寫入私有文件。
②SD卡文件讀寫
SD卡是設備的擴展存儲,掛載到Android操作系統(tǒng)的“/mnt/sdcard”目錄。可以使用FileInputStream和FileOutputStre am進行讀寫。
2)簡單共享文件讀寫
為了實現(xiàn)不同進程之間共享數(shù)據(jù),Android提供了SharedPreferences類支持簡單數(shù)據(jù)共享。該文件保存在“/data/data/<package name>/shared_prefs”目錄中。
①寫入SharedPreferences
SharedPreferences sp= getSharedPreferences("config",Context.MODE_PRIVATE);
Editor editor=sp.edit();
editor.putString("uname","root");
editor.putString("pwd","12345");
editor.commit();
程序執(zhí)行完后得到config.xm l文件,文件主要內容如下:
<map>
<string name="uname">root</string>
<string name="pwd">12345</string>
</map>
②讀取SharedPreferences
SharedPreferences sp=getSharedPreferences("config",Context.MODE_PRIVATE);
String name=sp.getString("uname");
String pwd=sp.getString("pwd");
為實現(xiàn)共享,兩個應用的sharedUserId的內容要相同,同時雙方使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE模式讀寫內容。
3)XML 文件讀寫
讀寫XML文件的關鍵在于如何解析文件,常見的有兩種解析方式:SAX(Simple API for XML)和 DOM(Document ObjectModel)。兩種解析方式中,SAX占用資源少、速度快,但是不能進行查找和修改;DOM將XML記入內存可以反復查詢和修改,但是占用內存多、分析效率低[8]。
Android中提供了 Xm lResourceParser類,實現(xiàn)Xm lPullParser接口,是基于SAX的XML分析器。在使用Xm lResourceParser進行解析時主要依據(jù)各種事件類型進行處理。
Android中內置的SQLite數(shù)據(jù)庫管理系統(tǒng)由C語言編寫,支持SQL操作[9]。默認情況下,數(shù)據(jù)庫文件保存在“/data/data/<應用程序包>/databases”中,也可以保存到任意有權限訪問的目錄。
訪問SQLite數(shù)據(jù)庫一般分為3個步驟:創(chuàng)建數(shù)據(jù)庫連接、數(shù)據(jù)操作和關閉連接。
1)創(chuàng)建連接
在Android開發(fā)中可以繼承SQLiteOpenHelper類實現(xiàn)數(shù)據(jù)庫連接的創(chuàng)建。下面代碼創(chuàng)建了到數(shù)據(jù)庫student.db的連接。
public class MyHpr extends SQLiteOpenHelper{//完成數(shù)據(jù)表創(chuàng)建}
于是,創(chuàng)建連接可以用下面語句完成:
MyHpr hp=new MyHpr(this);
SQLiteDatabase db=hp.getWritableDatabase();
2)數(shù)據(jù)操作
數(shù)據(jù)庫連接創(chuàng)建完成后可以執(zhí)行插入、修改、刪除和查詢操作。
①插入數(shù)據(jù)方法
ContentValues cv=new ContentValues();
cv.put(列名,列值);
db.insert(表名,null,cv);
②修改數(shù)據(jù)方法
ContentValues cv=new ContentValues();
cv.put(列名,列值);
db.update(表名,cv,where條件,修改條件中參數(shù)值);
③刪除數(shù)據(jù)方法
db.delete(表名,cv,where條件,修改條件中參數(shù)值);
④查詢數(shù)據(jù)方法
Cursor c=db.query(表名,select包含字段,where條件,條件中參數(shù)值,group子句,having子句,排序字段);
查詢操作將返回Cursor對象,通過該對象的moveToNext()方法可以讀取下一行數(shù)據(jù),通過getType(int ColIndex)方法可以獲取指定行中指定列的值。
3)關閉連接
當應用程序暫停、退出或不再需要操作數(shù)據(jù)庫時應該關閉數(shù)據(jù)庫連接:
db.close();
Android應用程序運行在不同的進程空間中,因此不同應用程序的數(shù)據(jù)不能直接訪問。盡管使用SharedPreferences可以簡單實現(xiàn)跨進程訪問,但存在一定局限性。
ContentProvider是應用程序之間共享數(shù)據(jù)的一種接口機制,是一種更為高級的數(shù)據(jù)共享方法,可以指定需要共享的數(shù)據(jù),而其他應用程序則可在不知道數(shù)據(jù)來源、路徑的情況下,對共享數(shù)據(jù)進行查詢、添加、刪除和更新等操作。
ContentProvider使用的URI語法結構如下
content://<authority>/<data_path>/<id>
創(chuàng)建ContentProvider分為下面3個步驟:
1)繼承 ContentProvider
新建立的類繼承ContentProvider后,共有6個函數(shù)需要重載,如表1所示。
表1 ContentProvider重載Tab.1 ContentProvider overloaded functions
2)聲明 CONTENT_URI,實現(xiàn) UriMatcher
在新構造的ContentProvider類中,經(jīng)常需要判斷URI是單條數(shù)據(jù)還是多條數(shù)據(jù),最簡單的方法是構造一個UriMatcher。
private static final UriMatcher uMr;
static{
uMr=new UriMatcher(UriMatcher.NO_MATCH);
uMr.addURI(授權者,單條數(shù)據(jù)路徑,單條標示);
uMr.addURI(授權者,多條數(shù)據(jù)路徑,多條標示);
}
3)注冊 ContentProvider
在完成ContentProvider類的代碼實現(xiàn)后,需要在AndroidManifest.xm l文件中進行注冊。
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<provider android:name=".自定義類名"android:authorities="授權名稱"/>
</application>
自定義ContentProvider完成后不需要直接調用類中的方法,而是通過ContentResolver對象進行數(shù)據(jù)操作。
ContentResolver r=getContentResolver();
ContentValues cv=new ContentValues();
UrinewUri=r.insert(uri,cv);
ContentValues cv1=new ContentValues();
int result=r.update(uri,cv1,where條件,條件中參數(shù)值);
int result1=r.delete(uri,where條件,條件中參數(shù)值);
Cursor cursor=r.query(uri,select包含字段,where條件,條件中參數(shù)值,排序字段);
上述3種數(shù)據(jù)訪問技術都能夠實現(xiàn)Android中數(shù)據(jù)的存儲與查詢,但是各有其優(yōu)缺點。在實際項目開發(fā)過程中需要根據(jù)應用場景確定選用何種數(shù)據(jù)存儲及訪問方式。
當需要存儲結構化不強且數(shù)據(jù)量較少的數(shù)據(jù)時考慮使用文件存儲方式。若保存的是“鍵-值”應用程序配置信息,適合采用SharedPreferences方式,這樣既方便存取訪問又能實現(xiàn)簡單共享。
當數(shù)據(jù)量較大且經(jīng)常做數(shù)據(jù)訪問操作時考慮使用數(shù)據(jù)庫存儲方式。如果只在一個應用程序內部進行數(shù)據(jù)訪問,直接構造數(shù)據(jù)庫連接進行訪問即可;如果需要在多個應用之間進行數(shù)據(jù)共享訪問,則使用ContentProvider實現(xiàn)共享。
通過對Android應用中3種常見數(shù)據(jù)存儲訪問技術的研究,闡述了各種訪問方式的基本實現(xiàn)方法,最后簡單分析各種技術的應用場景。對數(shù)據(jù)訪問技術的研究為更好地理解Android數(shù)據(jù)存儲訪問機制和原理,在應用程序開發(fā)中合理選用高效的存儲訪問方式提供重要依據(jù)。
[1]燕超霞.基于Android的工程材料信息管理系統(tǒng)的設計與實現(xiàn)[D].鄭州:鄭州大學,2012.
[2]劉婕.基于Android系統(tǒng)的移動終端通訊錄的研究與設計[D].西安:西安電子科技大學,2012.
[3]倪紅軍.基于Android系統(tǒng)的數(shù)據(jù)存儲訪問機制研究[J].計算機技術與發(fā)展,2013,23(6):90-93.NIHong-jun.Study of data storage accessmechanism based on android system [J]. Computer Technology and Development,2013,23(6):90-93.
[4]姚昱昱,劉衛(wèi)國.Android的架構與應用開發(fā)研究[J].計算機系統(tǒng)應用,2008,17(11):110-112.YAO Yu-yu,LIUWei-guo.Study of Android architecture and its application development [J].Computer Systems &Applications,2008,17(11):110-112.
[5]公磊,周聰.基于Android的移動終端應用程序開發(fā)與研究[J].計算機與現(xiàn)代化,2008(8):85-89.GONG Lei,ZHOU Cong.Development and research ofmobile termination application based on Android[J].Computer and Modernization,2008(8):85-89.
[6]楊超.基于Android平臺的電子閱讀客戶端的設計與實現(xiàn)[D].北京:北京交通大學,2011.
[7]Reto Meier.Professional Android 4 Application Development[M].John Wiley&Sons,Inc.,2012.
[8]朱珊娜,李書琴,安福定.XML文檔到關系數(shù)據(jù)庫的轉換研究[J].計算機工程與設計,2008,29(21):5507-5509.ZHU Shan-na,LI Shu-qin,AN Fu-ding.Conversion from XML document to relational database [J].Computer Engineering and Design,2008,29(21):5507-5509.
[9]趙珂.基于Android移動終端預約掛號系統(tǒng)的設計與實現(xiàn)[D].武漢:武漢理工大學,2012.