第四章數(shù)據(jù)存儲_第1頁
第四章數(shù)據(jù)存儲_第2頁
第四章數(shù)據(jù)存儲_第3頁
第四章數(shù)據(jù)存儲_第4頁
第四章數(shù)據(jù)存儲_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第9章章 數(shù)據(jù)存儲數(shù)據(jù)存儲Android中5種數(shù)據(jù)存儲方式 使用SharedPreferences臨時文件存儲首選項 文件存儲數(shù)據(jù) SQLite數(shù)據(jù)庫存儲數(shù)據(jù) 使用contentprovider存儲數(shù)據(jù)(主要實現(xiàn)數(shù)據(jù)共享) 網(wǎng)絡(luò)存儲數(shù)據(jù)第一節(jié)第一節(jié)SharedPreferencesSharedPreferencesv1、存儲臨時性數(shù)據(jù),保證下一次進入該系統(tǒng)、存儲臨時性數(shù)據(jù),保證下一次進入該系統(tǒng),能夠獲取該文件的數(shù)據(jù),進行操作。,能夠獲取該文件的數(shù)據(jù),進行操作。存儲數(shù)據(jù)和讀取數(shù)據(jù)的流程:存儲數(shù)據(jù)和讀取數(shù)據(jù)的流程:v 存儲數(shù)據(jù)信息存儲數(shù)據(jù)信息v 1)打開名為configuration的配置文件,

2、如果存在則打開它,否則創(chuàng)建新的名為configuration的配置文件v SharedPreferences sharedPreferences = getSharedPreferences(configuration, 0);v 2)讓sharedPreferences處于編輯狀態(tài)v SharedPreferences.Editor editor = sharedPreferences.edit();v 3)存放數(shù)據(jù)v editor.putString(name,harvey);v 4)完成提交v mit();v 讀取數(shù)據(jù)信息讀取數(shù)據(jù)信息v 1)打開名為configuration的配置文件v

3、 SharedPreferences sharedPreferences = getSharedPreferences(configuration, 0);v 2)獲取數(shù)據(jù)v String name = sharedPreferences.getString(name,默認(rèn)值);獲取獲取SharedPreferences對象方法對象方法vSharedPreferences pre = Context.getSharedPreferences(String name,int mode);v注:name為本組件的配置文件名(如果想要與本應(yīng)用程序的其他組件共享此配置文件,可以用這個名字來檢索到這個配

4、置文件,在這里要特別注意,因為在Android 中已經(jīng)確定了SharedPreferences 是以xml形式保存,所以,在填寫文件名參數(shù)時,不要給定“.xml”后綴,android會自動添加。只要直接寫上文件名即可。它會直接被保存在/data/data/shared_prefs路徑下,它是采用鍵值對的形式保存參數(shù)。當(dāng)你需要獲得某個參數(shù)值時,按照參數(shù)的鍵索引即可)。 vSharedPreferences支持的三種訪問模式(這三種模式可以由Activity調(diào)用:v1、 MODE_PRIVATE:只有創(chuàng)建這個SharedPreferences的Activity與權(quán)限讀寫它。v2、 MODE_WOR

5、LD_READABLE: 其他Activity對這個SharedPreferences具有可讀權(quán)限。v3、 MODE_WORLD_WRITEABLE:其他Activity對這個SharedPreferences也具有可讀可寫的權(quán)利練習(xí)練習(xí)第二節(jié)第二節(jié)文件存儲文件存儲簡介簡介v利用利用SharedPreferences只能保存簡單的數(shù)據(jù),只能保存簡單的數(shù)據(jù),要存儲更多類型的數(shù)據(jù),則需要使用文件的存儲操要存儲更多類型的數(shù)據(jù),則需要使用文件的存儲操作。對于文件的存儲操作,在作。對于文件的存儲操作,在Android中有兩種形中有兩種形式。式。v1、直接利用、直接利用Activity 提供的文件操作方法

6、。此類提供的文件操作方法。此類操作的所有文件路徑只能是操作的所有文件路徑只能是“datadatafiles文件文件名稱名稱”v2、利用、利用java IO流執(zhí)行操作。此類操作的文件可流執(zhí)行操作。此類操作的文件可以是任意路徑(包括以是任意路徑(包括sdcard)下,但是需要為其操下,但是需要為其操作授權(quán)。作授權(quán)。File類簡介類簡介v在在java中,中,F(xiàn)ile類既可以表示文件又可以表類既可以表示文件又可以表示目錄,它提供了操作文件或目錄的一組方示目錄,它提供了操作文件或目錄的一組方法法v 1: File f = new File(F:javarose); (其中其中F:javarose是一個已

7、經(jīng)存在的目錄是一個已經(jīng)存在的目錄),你可以調(diào)用,你可以調(diào)用file.exists()看看目錄是否存在,如存在則函數(shù)返回目錄是否存在,如存在則函數(shù)返回true,如不存在你可以調(diào)用,如不存在你可以調(diào)用 file.mkdir(); 創(chuàng)建創(chuàng)建rose目錄目錄。v 2: File file=new(f,“file1.txt”);可以實例化可以實例化F:javarose目錄下的文件目錄下的文件file1.txt(文件已存在文件已存在),你可以調(diào)用,你可以調(diào)用file.exists()看文看文件是否存在,如存在則函數(shù)返回件是否存在,如存在則函數(shù)返回true,如不存在你可以調(diào)用,如不存在你可以調(diào)用 file.

8、createNewFile()創(chuàng)建創(chuàng)建 file1.txt文件。注意,當(dāng)你實例化一個文件。注意,當(dāng)你實例化一個已經(jīng)存在的文件時,一定要加上后綴名,如已經(jīng)存在的文件時,一定要加上后綴名,如.txt等,否則實例化的文件等,否則實例化的文件是不存在的。調(diào)用是不存在的。調(diào)用file.exists()返回返回false.Environment類簡介類簡介v Environment 是一個提供訪問環(huán)境變量的類是一個提供訪問環(huán)境變量的類。v Environment 常用方法:常用方法:v 01.方法:方法:getDataDirectory() v 02.解釋:返回解釋:返回 File ,獲取,獲取 Andr

9、oid 數(shù)據(jù)目錄數(shù)據(jù)目錄。 v 03.方法:方法:getDownloadCacheDirectory() v 04.解釋:返回解釋:返回 File ,獲取,獲取 Android 下載下載/緩存內(nèi)容目錄。緩存內(nèi)容目錄。v 05.方法:方法:getExternalStorageDirectory()v 06.解釋:返回解釋:返回 File ,獲取外部存儲目錄即,獲取外部存儲目錄即 SDCard v 07.方法:方法:getExternalStoragePublicDirectory(String type)v 08.解釋:返回解釋:返回 File ,取一個高端的公用的外部存儲器目錄來擺放某些,取一

10、個高端的公用的外部存儲器目錄來擺放某些類型的類型的文件文件 v 09.方法:方法:getExternalStorageState() v 10.解釋:返回解釋:返回 File ,獲取外部存儲設(shè)備的當(dāng)前,獲取外部存儲設(shè)備的當(dāng)前狀態(tài)狀態(tài) v 11.方法:方法:getRootDirectory() v12.解釋:返回解釋:返回 File ,獲取,獲取 Android 的根目錄的根目錄文件字節(jié)輸入文件字節(jié)輸入/輸出流輸出流v文件字節(jié)輸入文件字節(jié)輸入/輸出輸出流是指流是指FileInputStream 和和FileOutputStream類,它們實現(xiàn)了對文類,它們實現(xiàn)了對文件的順序訪問,并以字節(jié)為單位進

11、行讀件的順序訪問,并以字節(jié)為單位進行讀/寫操寫操作作vFileOutputStream用于將字節(jié)數(shù)據(jù)寫出用于將字節(jié)數(shù)據(jù)寫出到文件。繼承自到文件。繼承自O(shè)utputStream類類構(gòu)造方法摘要構(gòu)造方法摘要FileOutputStream(File file) 創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流。FileOutputStream(File file, boolean append) 創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流。FileOutputStream(FileDescriptor fdObj) 創(chuàng)建一個向指定文件描述符處寫入數(shù)據(jù)的輸出文件流,

12、該文件描述符表示一個到文件系統(tǒng)中的某個實際文件的現(xiàn)有連接。FileOutputStream(String name) 創(chuàng)建一個向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。FileOutputStream(String name, boolean append) 創(chuàng)建一個向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流。常用方法Close():關(guān)閉緩沖輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。Write(int b): 將指定的字節(jié)寫入此緩沖輸出流Write(byte b):將b.length個字節(jié)寫入此緩沖輸出流。案例案例vFile file=new file(“d:test.txt);vFil

13、eOutputStream fos=new FileOutputStream(file);vString x=“iamok”vFos.write(x.getbytes()vFos.closeFileInputStreamv一、構(gòu)造方法一、構(gòu)造方法v FileInputStream(String name); /使用給定的文件名創(chuàng)建對象使用給定的文件名創(chuàng)建對象v FileInputStream(File file); /使用使用File對象創(chuàng)建對象創(chuàng)建FileInputStream對對象象v 二、讀取文件二、讀取文件v 1.使用文件輸入流讀取文件使用文件輸入流讀取文件v FileInuputSt

14、ream istream=new ileInputStream(myfile.dat);v 或:或:v File f=new File(myfile.dat);v FileInputStream istream=new FileInputStream(f);v 構(gòu)造方法可能會產(chǎn)生異常構(gòu)造方法可能會產(chǎn)生異常IOException,故為了把一個文件輸入流對象與一個故為了把一個文件輸入流對象與一個文件關(guān)聯(lián)起來,需:文件關(guān)聯(lián)起來,需:v try FileInputStream ins=new FileInputStream(myfile.dat);v catch (IOException e) Sys

15、tem.out.println(File read error:+e);v 2.從輸入流中讀取字節(jié)從輸入流中讀取字節(jié)v int read(); /從輸入流中讀取單個字節(jié)數(shù)據(jù)(從輸入流中讀取單個字節(jié)數(shù)據(jù)(0255),如到輸入流末尾),如到輸入流末尾則返回則返回-1v int read(byte b); /讀多個字節(jié)讀多個字節(jié)v int read(byte b,int off,int len);v 3.關(guān)閉流關(guān)閉流v Java在程序結(jié)束時自動關(guān)閉所有打開的流,但顯式關(guān)閉任何打開的流是一個好在程序結(jié)束時自動關(guān)閉所有打開的流,但顯式關(guān)閉任何打開的流是一個好習(xí)慣。習(xí)慣。v close(); FileIn

16、putStream使用案例使用案例v FileInputStream f=FileInputStream(/home/software./root/ends,jsp);BufferedInputStream bu=new BufferedInputStream(f);byte a=new byte10;int n;while(n=bu.read(a)!=-1)String s=new String(a,o,n)out.println(s);f.close();bu.close();read返回的是一個整型的數(shù),當(dāng)?shù)轿募奈矔r候返回返回的是一個整型的數(shù),當(dāng)?shù)轿募奈矔r候返回-1,也就是說也就是說

17、read一次讀取的字節(jié)數(shù)為字節(jié)數(shù)組的長度。一次讀取的字節(jié)數(shù)為字節(jié)數(shù)組的長度。SQLite簡單介紹 vSQ為Structured Query (結(jié)構(gòu)化查詢)的縮寫,Lite表示輕量級。SQLite是一款開源的關(guān)系型數(shù)據(jù)庫。幾乎可以支持所有現(xiàn)代編程語言和各種操作系統(tǒng)v對SQLite數(shù)據(jù)庫的操作一般包括:創(chuàng)建一個數(shù)據(jù)庫,打開數(shù)據(jù)庫,關(guān)閉數(shù)據(jù)庫,刪除數(shù)據(jù)庫。創(chuàng)建和打開數(shù)據(jù)庫的方法: v 使用openOrCreateDatabase()方法來創(chuàng)建,若數(shù)據(jù)庫不存在,則會創(chuàng)建新數(shù)據(jù)庫,若存在,則打開數(shù)據(jù)庫。 v openOrCreateDatabase()方法的返回值為一個SQLiteDatabase對象

18、v openOrCreateDatabase()方法的官方說明v public SQLiteDatabase openOrCreateDatabase (String name, int mode, SQLiteDatabase.CursorFactoryfactory)v 第一個參數(shù)為數(shù)據(jù)庫的名字,string類型。v 第二個參數(shù)為常量,如下所示常量 含義MODE_PRIVATE 默認(rèn)模式,值為0,文件只可以被調(diào)用該方法的應(yīng)用程序訪問v MODE_WORLD_READABLE 所有的應(yīng)用程序都具有對該文件讀的權(quán)限。v MODE_WORLD_WRITEABLE 所有的應(yīng)用程序都具有對該文件寫的

19、權(quán)限。v 第三個參數(shù)當(dāng)query方法被調(diào)用時,用來實例化cursor,通常為null例如:SQLiteDatabase sld=this.openOrCreateDatabase(“teacher.db,0,null);v關(guān)閉SQLite數(shù)據(jù)庫v對數(shù)據(jù)庫操作完畢之后,就要關(guān)閉數(shù)據(jù)庫,否則會拋出SQLiteException異常。關(guān)閉數(shù)據(jù)庫只需調(diào)用成SQLiteDatabase對象的.close()方法即可。例如:sld.close()刪除數(shù)據(jù)庫v直接調(diào)用deleteDatabase()方法即可,如:例如:this.deleteDatabase (“teacher.db);SQLite數(shù)據(jù)庫中(

20、Table )“表”的操作方法 v 首先要明確一點的是,一個數(shù)據(jù)庫可以有很多表,一個表中包含很多條數(shù)據(jù),也就是說,在數(shù)據(jù)庫里面保存數(shù)據(jù)其實是保存在Table (表)里面的。對已經(jīng)存在和已經(jīng)創(chuàng)建的數(shù)據(jù)庫操作一般包括:創(chuàng)建表,往表添加數(shù)據(jù),從表中刪除數(shù)據(jù),修改表中的數(shù)據(jù),查詢表中的數(shù)據(jù),刪除已存在的表。 創(chuàng)建一個表v通過調(diào)用數(shù)據(jù)庫的execSQL (String sql)方法可以創(chuàng)建一個table(表)vpublic void execSQL(String sql)vexecSQL (String sql)方法的參數(shù)“sql“是SQL語句,為字符串類型。如例如:SQLiteDatabase db;

21、 String sql = CREATE TABLE pic (_id INTEGER PRIMARY KEY , filename VARCHAR(10), data TEXT); db.execSQL(sql); Sql 中最簡單的創(chuàng)建表的方法Create table 表名(字段1 數(shù)據(jù)類型,字段2 數(shù)據(jù)類型,字段3 數(shù)據(jù)類型,字段4 數(shù)據(jù)類型)項目初始化的代碼項目初始化的代碼String cmd=create table user(id varchar(20) PRIMARY KEY,username varchar(20),password varchar(10);sld.execSQ

22、L(cmd);AlertDialog.Builder ald=new AlertDialog.Builder(MainActivity.this);ald.setTitle(提示);ald.setMessage(表創(chuàng)建成功);ald.setPositiveButton(確定, null);ald.show();向表中插入一條數(shù)據(jù)v 往數(shù)據(jù)庫的table插入數(shù)據(jù),可以直接調(diào)用db.insert()方法插入,但是insert()方法中的第三個參數(shù)是一個ContentValues的,其實也就是一個map,包含了一些鍵值對(key-value)。通過contentValues的put方法,可以把鍵值對

23、放進contentValues里面,然后再通過db.insert()方法插到數(shù)據(jù)庫的table中。vpublic long insert(String table,String nullColumnHack, ContentValues values)vinsert的第一個參數(shù)是的第一個參數(shù)是table的名字,第二個參數(shù)一般為的名字,第二個參數(shù)一般為null,第三個參數(shù)是,第三個參數(shù)是contentValues。若成功。若成功insert,就返回新插入就返回新插入row的的id,不成功返回,不成功返回-1。vContentValues cv =new contentValues(); vcv.

24、put(“num”,1); vcv.put(“data”, 測試我的數(shù)據(jù)庫); vdb.insert(table,null,cv); 項目中增加一條新記錄的方法項目中增加一條新記錄的方法public void onClick(View v) / TODO Auto-generated method stubString id=et1.getText().toString();String name=et2.getText().toString();String psw=et3.getText().toString();ContentValues cv=new ContentValues();c

25、v.put(id,id );cv.put(username, name);cv.put(password, psw);sld.insert(user, null, cv);AlertDialog.Builder ald=new AlertDialog.Builder(MainActivity.this);ald.setTitle(提示);ald.setMessage(數(shù)據(jù)添加成功);ald.setPositiveButton(確定, null);ald.show();查詢查詢vquery(String table, String columns, String whereClause, Str

26、ing selectionArgs, String groupBy, Sttring having, String orderBy, String limit) v table: 查詢數(shù)據(jù)的表名 v columns: 要查詢的列名v whereClause: 條件查詢 v whereArgs:條件查詢的參數(shù) v groupBy: 控制分組 v having: 分組過濾 v orderBy: 排序 v limit: 進行分頁 v Select * from mj ;v rawQuery(cmd,null)v Query(mj, new String“id”,”name”,”english? An

27、d maths?”,new String“98”,”78”,null,null,null,null)Cursor類v在在android中查詢數(shù)據(jù)是通過中查詢數(shù)據(jù)是通過cursor類來類來實現(xiàn)的,當(dāng)我使用實現(xiàn)的,當(dāng)我使用SQliteDatabase.query()方法時,會得方法時,會得到一個到一個Cursor對象,對象,Cursor指向的就是每指向的就是每一條數(shù)據(jù)一條數(shù)據(jù)Cursor對象的常用方法 vmove(int offset); /以當(dāng)前位置為參考,移動到指定行 vmoveToFirst(); /移動到第一行 vmoveToLast(); /移動到最后一行 vmoveToPosition

28、(int position); /移動到指定行 vmoveToPrevious(); /移動到前一行 vmoveToNext(); /移動到下一行 visFirst(); /是否指向第一條 visLast(); /是否指向最后一條 visBeforeFirst(); /是否指向第一條之前 v isAfterLast(); /是否指向最后一條之后 visNull(int columnIndex); /指定列是否為空(列基數(shù)為0) visClosed(); /游標(biāo)是否已關(guān)閉 vgetCount(); /總數(shù)據(jù)項數(shù) vgetPosition(); /返回當(dāng)前游標(biāo)所指向的行數(shù) vgetColumnIn

29、dex(String columnName);/返回某列名對應(yīng)的列索引值 vgetString(int columnIndex); /返回當(dāng)前行指定列的值 項目中查詢按鈕的代碼項目中查詢按鈕的代碼v Cursor cur=sd.query(banji1, null, null, null, null, null, null);v tv7.setText(本表共本表共+cur.getCount()+條記錄,現(xiàn)在是第條記錄,現(xiàn)在是第1條條記錄記錄);v cur.moveToFirst();v tv4.setText(cur.getString(0);v tv5.setText(cur.getStr

30、ing(1);v tv6.setText(cur.getString(2);v cur_count=1;案例中下一條按鈕功能的實現(xiàn)案例中下一條按鈕功能的實現(xiàn)v Cursor cur=sd.query(banji1, null, null, null, null, null, null);v if(cur_countcur.getCount()v cur_count+;v tv7.setText(本表共本表共+cur.getCount()+條記錄,現(xiàn)在是第條記錄,現(xiàn)在是第+cur_count+條記錄條記錄);v cur.move(cur_count);v tv4.setText(cur.getS

31、tring(0);v tv5.setText(cur.getString(1);v tv6.setText(cur.getString(2);v elsev AlertDialog.Builder ad=new AlertDialog.Builder(MainActivity.this);v ad.setTitle(提示提示);v ad.setMessage(已為最后一條記錄了!已為最后一條記錄了!);v ad.setPositiveButton(確定確定, null);v ad.show();v 更新表中的數(shù)據(jù)更新表中的數(shù)據(jù)v 直接調(diào)用數(shù)據(jù)庫的db.update()方法。v public int update(String table,values,String whereClause,String whereArgs)v 第一個參數(shù)table名第二個參數(shù)更新條件,為字符串。第三個參數(shù)字符串?dāng)?shù)組,和whereClause配合使用。 用法一、如果whereClause的條件已經(jīng)直接給出,如“name= “ + num,num是傳入的參數(shù)。則whereArg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論