




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章
數(shù)據(jù)存儲與訪問
本章學習目標:掌握SharedPreferences的使用方法掌握各種文件存儲的區(qū)別與適用情況掌握SQLite數(shù)據(jù)庫的體系結構、建立和操作方法掌握ContentProvider的原理、創(chuàng)建與使用方法8.1簡單存儲8.1.1SharedPreferencesSharedPreferences是一種輕量級的數(shù)據(jù)保存方式以NVP(Name/ValuePair,名稱/值對)保存SharedPreferences完全屏蔽了對文件系統(tǒng)的操作過程調用SharedPreferences中的函數(shù)就可以實現(xiàn)對NVP的保存和讀取SharedPreferences訪問權限私有(MODE_PRIVATE):僅創(chuàng)建SharedPreferences的程序有權限對其進行讀取或寫入全局讀(MODE_WORLD_READABLE):不僅創(chuàng)建程序可以對其進行讀取或寫入,其它應用程序也具有讀取操作的權限,但沒有寫入操作的權限全局寫(MODE_WORLD_WRITEABLE):所有程序都可以對其進行寫入操作,但沒有讀取操作的權限8.1簡單存儲8.1.2示例下面將通過SimplePreferenceDemo示例介紹SharedPreferences的文件保存位置和保存格式下圖是SimplePreferenceDemo示例的用戶界面8.1簡單存儲8.1.2示例Android系統(tǒng)為每個應用程序建立了與包同名的目錄,用來保存應用程序產(chǎn)生的數(shù)據(jù)文件,包括普通文件SharedPreferences產(chǎn)生的文件就保存在/data/data/<packagename>/shared_prefs目錄下Demo中示例回退保存文件后出現(xiàn)
查看方式:命令行下,adbshell8.1簡單存儲8.1.2示例SaveSetting.xml文件是以XML格式保存的信息,內容如下1<?xmlversion='1.0'encoding='utf-8'standalone='yes'?>2<map>3 <floatname="Height"value="1.81"/>4 <stringname="Name">Tom</string>5 <intname="Age"value="20"/>6</map>8.2文件存儲8.2.1內部存儲存儲在機器自帶的存儲空間里Android系統(tǒng)允許應用程序創(chuàng)建僅能夠自身訪問的私有文件,文件保存在設備的內部存儲器上保存地點:在Android系統(tǒng)下的/data/data/<packagename>/files目錄中文件操作方式:標準Java的IO類和方法Android流式文件操作方式openFileOutput()//寫文件openFileInput()//讀文件特點:限定文件的保存地點,適合小文件8.2文件存儲8.2.1內部存儲openFileOutput()如果指定的文件存在,直接打開文件準備寫入數(shù)據(jù)如果指定的文件不存在,則創(chuàng)建一個新的文件格式:publicFileOutputStreamopenFileOutput(Stringname,intmode)第1個參數(shù)是文件名稱,這個參數(shù)不可以包含描述路徑的斜杠第2個參數(shù)是操作模式,Android系統(tǒng)支持四種文件操作模式
函數(shù)的返回值是FileOutputStream類型8.2文件存儲8.2.1內部存儲openFileOutput文件模式模式
說明
MODE_PRIVATE私有模式,缺陷模式,文件僅能夠被創(chuàng)建文件的程序訪問,或具有相同UID的程序訪問。MODE_APPEND追加模式,如果文件已經(jīng)存在,則在文件的結尾處添加新數(shù)據(jù)。MODE_WORLD_READABLE全局讀模式,允許任何程序讀取私有文件。MODE_WORLD_WRITEABLE全局寫模式,允許任何程序寫入私有文件。8.2文件存儲8.2.1內部存儲openFileInput()格式:publicFileInputStreamopenFileInput(Stringname)
參數(shù)是文件名稱,不允許包含描述路徑的斜杠使用openFileInput()函數(shù)打開已有文件,并以二進制方式讀取數(shù)據(jù)的示例代碼如下1StringFILE_NAME="fileDemo.txt";2FileInputStreamfis=openFileInput(FILE_NAME);34byte[]readBytes=newbyte[fis.available()];5while(fis.read(readBytes)!=-1){6}8.2文件存儲8.2.1內部存儲InternalFileDemo用戶界面圖8.2文件存儲8.2.2外部存儲文件保存于SD卡MicroSD卡使用FAT文件系統(tǒng),不支持訪問模式和權限控制(安全性低)適合大容量文件可以指定SD卡中的文件存放位置需要SD卡的加載權限與寫入權限文件保存在/mnt/sdcard(sdcard)目錄下8.2文件存儲8.2.2外部存儲SDcardFileDemo用戶界面圖8.2文件存儲8.2.3資源文件文件與項目在一起,位于項目/res/raw和/res/xml目錄中的原始格式文件和XML文件操作原始格式文件可以是任何格式的文件,例如視頻格式文件、音頻格式文件、圖像文件或數(shù)據(jù)文件等等在應用程序編譯和打包時,/res/raw目錄下的所有文件都會保留原有格式不變。而/res/xml目錄下一般用來保存格式化數(shù)據(jù)的XML文件,則會在編譯和打包時將XML文件轉換為二進制格式,用以降低存儲器空間占用和提高訪問效率,在應用程序運行的時候會以特殊的方式進行訪問資源文件有專門的類進行操作8.2文件存儲8.2.3資源文件ResourceFileDemo示例演示了如何在程序運行時訪問資源文件當用戶點擊“讀取原始文件”按鈕時,程序將讀取/res/raw/raw_file.txt文件,并將內容顯示在界面上,如下圖所示8.3
數(shù)據(jù)庫存儲8.3.1
SQLite數(shù)據(jù)庫SQLite是一個2000年由D.RichardHipp發(fā)布的開源嵌入式關系數(shù)據(jù)庫輕量級數(shù)據(jù)庫SQLite的特點比傳統(tǒng)數(shù)據(jù)庫更適合用于嵌入式系統(tǒng)占用資源少,運行高效可靠,可移植性強提供了零配置(zero-configuration)運行模式SQLite數(shù)據(jù)庫的優(yōu)勢可以嵌入到使用它的應用程序中客戶端和服務器在同一進程空間運行簡化了數(shù)據(jù)庫的管理過程8.3
數(shù)據(jù)庫存儲8.3.2手動建庫啟動Android虛擬機AndroidSDK目錄/platform-tools/下啟動adbshellLinux命令提示符下輸入sqlite3啟動sqlite常用命令編號命令說明12.modeMODE?TABLE?設置輸入格式13.databases顯示數(shù)據(jù)庫名稱和文件位置17.quit退出19.schema?TABLE?顯示表的創(chuàng)建語句22.tables?PATTERN?顯示符合匹配模式的表名8.3
數(shù)據(jù)庫存儲8.3.2手動建庫創(chuàng)建數(shù)據(jù)庫命令:Sqlite3peopleinfo
如果數(shù)據(jù)庫存在則打開,不存在則創(chuàng)建Create語句創(chuàng)建表1 sqlite>createtablepeopleinfo2 ...>(_idintegerprimarykeyautoincrement,3 ...>nametextnotnull,4 ...>ageinteger,5 ...>heightfloat);6 sqlite>8.3
數(shù)據(jù)庫存儲8.3.2手動建庫.tables命令,顯示當前數(shù)據(jù)庫中的所有表.schema命令查看建立表時使用的SQL命令1 sqlite>.tables2 poepleinfo3 sqlite>1 sqlite>.schema2 CREATETABLEpeopleinfo3 (_idintegerprimarykeyautoincrement,4 nametextnotnull,5 ageinteger,6 heightfloat);7 sqlite>8.3
數(shù)據(jù)庫存儲8.3.2手動建庫1 sqlite>insertintopeopleinfovalues(null,'Tom',21,1.81);2 sqlite>insertintopeopleinfovalues(null,'Jim',22,1.78);3 sqlite>insertintopeopleinfovalues(null,'Lily',19,1.68);因為_id是自動增加的主鍵,因此在輸入null后,SQLite數(shù)據(jù)庫會自動填寫該項的內容_idnameageheight1Tom211.812Jim221.783Lily191.688.3
數(shù)據(jù)庫存儲8.3.2手動建庫.mode命令支持:column格式,還支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式1 sqlite>.modecolumn2 sqlite>select*frompeopleinfo;3 1Tom211.814 2Jim221.785 3Lily191.686 sqlite>8.3
數(shù)據(jù)庫存儲8.3.3代碼操作在Android系統(tǒng)中,每個應用程序的SQLite數(shù)據(jù)庫被保存在各自的/data/data/<packagename>/databases目錄下缺省情況下,所有數(shù)據(jù)庫都是私有的,僅允許創(chuàng)建數(shù)據(jù)庫的應用程序訪問,如果需要共享數(shù)據(jù)庫則可以使用ContentProviderSQLiteOpenHelper,打開數(shù)據(jù)庫SQLiteDatabase,執(zhí)行SQL語句,完成數(shù)據(jù)查詢與更新流程:創(chuàng)建數(shù)據(jù)表打開數(shù)據(jù)庫插入,更新,刪除,查詢關閉數(shù)據(jù)庫8.3
數(shù)據(jù)庫存儲8.3.3代碼操作SQLiteDemo用戶界面8.3.3代碼操作SQLiteOpenHelper方法getReadableDatabase()會先以讀寫方式打開數(shù)據(jù)庫,如果磁盤空間滿了,數(shù)據(jù)庫打開失敗,會以只讀打開,如果問題解決,只讀對象就會關閉,返回可讀寫對象getWritableDatabase()創(chuàng)建或打開一個可以讀寫的數(shù)據(jù)庫8.3
數(shù)據(jù)庫存儲8.3.3代碼操作SQLiteOpenHelper運行機制如果數(shù)據(jù)庫不存在,調用onCreat(),不調用onUpgrade();如果數(shù)據(jù)庫存在,但是版本不一樣,調用onUpgrade(),不調用onCreate();如果數(shù)據(jù)庫存在,版本也一樣,調用onCreate()和onUpgrade();當調用getWritableDatabase,getReadableDatabase如果數(shù)據(jù)庫沒有打開,就調用onOpen方法,如果打開了就不調onOpen;
數(shù)據(jù)庫的表的創(chuàng)建一般都在SQLiteOpenHelper的onCreat()中,表字段升級,都會在onUpgrade()處理;8.3
數(shù)據(jù)庫存儲8.3.3代碼操作數(shù)據(jù)庫操作insert(Stringtable,StringnullColumnHack,ContentValuesvalues)//第二個參數(shù)一般為null,表示允許插入空值update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)delete(Stringtable,StringwhereClause,String[]whereArgs)Cursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)execSQL()執(zhí)行insert、delete、update和CREATETABLE之類有更改行為的SQL語句;rawQuery()方法用于執(zhí)行select語句。
8.3
數(shù)據(jù)庫存儲SQLiteDatabasequery參數(shù)說明位置
類型+名稱
說明
1Stringtable表名稱2String[]columns返回的屬性列名稱3Stringselection查詢條件4String[]selectionArgs如果在查詢條件中使用通配符(?),則需要在這里定義替換符的具體內容5StringgroupBy分組方式6Stringhaving定義組的過濾器7StringorderBy排序方式8.4
數(shù)據(jù)分享8.4.1ContentProviderAndroid應用程序運行在不同的進程空間中,不同應用程序的數(shù)據(jù)是不能夠直接訪問的ContentProvider是應用程序之間共享數(shù)據(jù)的一種接口機制,可以指定需要共享的數(shù)據(jù),而其它應用程序則則可在不知道數(shù)據(jù)來源、路徑的情況下,對共享數(shù)據(jù)進行查詢、添加、刪除和更新等操作ContentProvider完全屏蔽了數(shù)據(jù)提供組件的數(shù)據(jù)存儲方法調用者無需知道數(shù)據(jù)提供者的內部數(shù)據(jù)的存儲方法8.4
數(shù)據(jù)分享8.4.1ContentProvider調用者不能直接調用ContentProvider的接口函數(shù),而需要使用ContentResolver對象,通過URI間接調用ContentProvider,調用關系如下圖所示8.4
數(shù)據(jù)分享8.4.1ContentProvider調用ContentResolver對象通過URI確定要訪問的ContentProvider數(shù)據(jù)集URI是通用資源標志符(UniformResourceIdentifier),用來定位遠程或本地的可用資源ContentProvider使用的URI語法結構如下1 content://<authority>/<data_path>/<id>content://是通用前綴,表示該URI用于ContentProvider定位資源<authority>授權者,確定哪個ContentProvider提供資源一般<authority>都由類的小寫全稱組成,以保證唯一性。<data_path>是數(shù)據(jù)路徑,用來確定請求的是哪個數(shù)據(jù)集8.4
數(shù)據(jù)分享8.4.1ContentProvider調用如果請求的數(shù)據(jù)并不只限于一條數(shù)據(jù),則<id>是可以省略,例如
請求整個people數(shù)據(jù)集的URI應寫為1content://edu.hrbeu.peopleprovider/people請求people數(shù)據(jù)集中第3條數(shù)據(jù)的URI則應寫為1content://edu.hrbeu.peopleprovider/people/38.4
數(shù)據(jù)分享8.4.2創(chuàng)建數(shù)據(jù)提供者ContentProvider程序開發(fā)人員通過繼承ContentProvider類可以創(chuàng)建一個新的數(shù)據(jù)提供者,過程可以分為三步繼承ContentProvider,并重載六個函數(shù)聲明CONTENT_URI,實現(xiàn)UriMatcher注冊ContentProvider8.4
數(shù)據(jù)分享8.4.2創(chuàng)建數(shù)據(jù)提供者1.創(chuàng)建ContentProvider,重載六個函數(shù)新建立的類繼承ContentProvider后,共有六個函數(shù)需要重載,分別是delete():刪除數(shù)據(jù)集insert():添加數(shù)據(jù)集qurey():查詢數(shù)據(jù)集update():更新數(shù)據(jù)集onCreate():初始化底層數(shù)據(jù)集和建立數(shù)據(jù)連接等工作getType():返回指定URI的MIME數(shù)據(jù)類型如果URI是單條數(shù)據(jù),則返回的MIME數(shù)據(jù)類型應以vnd.android.cursor.item開頭如果URI是多條數(shù)據(jù),則返回的MIME數(shù)據(jù)類型應以vnd.android.cursor.dir/開頭8.4
數(shù)據(jù)分享8.4.2創(chuàng)建數(shù)據(jù)提供者2.聲明CONTENT_URI和構造UriMatcher的代碼如下1 publicstaticfinalStringAUTHORITY="edu.hrbeu.peopleprovider";2 publicstaticfinalStringPATH_SINGLE=“people/#”;//單條數(shù)據(jù)路徑,#可以代表任何數(shù)字3 publicstaticfinalStringPATH_MULTIPLE=“people”;//多條數(shù)據(jù)路徑4 publicstaticfinalStringCONTENT_URI_STRING="content://"+AUTHORITY+"/"+PATH_MULTIPLE;5 publicstaticfinalUriCONTENT_URI=Uri.parse(CONTENT_URI_STRING);6 privatestaticfinalintMULTIPLE_PEOPLE=1;//返回代碼7 privatestaticfinalintSINGLE_PEOPLE=2;8 9 privatestaticfinalUriMatcheruriMatcher;10 static{11 uriMatcher=newUriMatcher(UriMatcher.NO_MATCH);12 uriMatcher.addURI(AUTHORITY,PATH_SINGLE,MULTIPLE_PEOPLE);13 uriMatcher.addURI(AUTHORITY,PATH_MULTIPLE,SINGLE_PEOPLE);14 }8.4
數(shù)據(jù)分享8.4.2創(chuàng)建數(shù)據(jù)提供者UriMatcher,識別來訪者需要調用多條還是單數(shù)數(shù)據(jù)使用UriMatcher時,則可以直接調用match()函數(shù),對指定的URI進行判斷,示例代碼如下1switch(uriMatcher.match(uri)){2 caseMULTIPLE_PEOPLE:3 //多條數(shù)據(jù)的處理過程4 break;5 caseSINGLE_PEOPLE:6 //單條數(shù)據(jù)的處理過程7 break;8 default:9 thrownewIllegalArgumentException("不支持的URI:"+uri);10}8.4
數(shù)據(jù)分享8.4.2創(chuàng)建數(shù)據(jù)提供者3.注冊ContentProvider在完成ContentProvider類的代碼實現(xiàn)后,需要在AndroidManifest.xml文件中進行注冊注冊ContentProvider使用<provider>標簽,示例代碼如下1 <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">2 <providerandroid:name=".PeopleProvider"3 android:authorities="edu.hrbeu.peopleprovider"/>4 </application>在上面的代碼中,注冊了一個授權者名稱為edu.hrbeu.peopleprovider的ContentProvider,其實現(xiàn)類是PeopleProvider8.4
數(shù)據(jù)分享8.4.3使用數(shù)據(jù)提供者每個Android組件都具有一個ContentResolver對象,獲取ContentResolver對象的方法是調用getContentResolver()函數(shù)ContentResolverresolver=getContentResolver();8.4
數(shù)據(jù)分享8.4.3使用數(shù)據(jù)提供者查詢操作在獲取到ContentResolver對象后,程序開發(fā)人員則可以使用query()函數(shù)查詢目標數(shù)據(jù)下面的代碼是查詢ID為2的數(shù)據(jù)1 StringKEY_ID="_id";2 StringKEY_NAME="name";3 StringKEY_AGE="age";4 StringKEY_HEIGHT="height";5 6 Uriuri=Uri.parse(CONTENT_URI_STRING+"/"+"2";7 Cursorcursor=resolver.query(uri,8 newString[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null,null,null);8.4
數(shù)據(jù)分享8.4.3使用數(shù)據(jù)提供者查詢操作ContentResolver的query()函數(shù)語法結構如下1 Cursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)uri定義了查詢的數(shù)據(jù)集projection定義了從應返回數(shù)據(jù)的哪些屬性selection定義了返回數(shù)據(jù)的查詢條件selectArgs,查詢參數(shù)sortOrder查詢結果排序8.4
數(shù)據(jù)分享8.4.3使用數(shù)據(jù)提供者添加操作insert()函數(shù),向ContentProvider中添加一條數(shù)據(jù)bultInsert()函數(shù),批量的添加數(shù)據(jù)1 ContentValuesvalues=newContentValues();2 value
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同內容保密協(xié)議
- 三農(nóng)經(jīng)濟園區(qū)發(fā)展規(guī)劃與實施方案
- 公司年度預算分析報告
- 企業(yè)安全生產(chǎn)活動《安全知識競賽》
- 土建清工承包合同
- 2025年昌都貨運從業(yè)資格證考試題及答案
- 認知1建筑工程測量概述
- 三農(nóng)家庭農(nóng)場經(jīng)營管理辦法
- 2025年甘肅貨運上崗證考試題庫答案
- 普通購銷合同
- 中電朝陽250兆瓦智慧風儲一體化風電項目環(huán)評報告書
- 生產(chǎn)組織供應能力說明
- 碳酸丙烯酯法脫碳工藝工程設計
- 藥劑學-名詞解釋
- 口語課件Unit 1 Ways of Traveling Possibility and Impossibility
- 做一個幸福教師
- 城市支路施工組織設計
- 耐堿玻纖網(wǎng)格布檢測報告
- 20米往返跑教案 (2)
- 甲醛安全周知卡
- 《書法練習指導》教案江蘇鳳凰少年兒童出版社四年級下冊
評論
0/150
提交評論