Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)-課件 第5章 數(shù)據(jù)存儲(chǔ)_第1頁(yè)
Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)-課件 第5章 數(shù)據(jù)存儲(chǔ)_第2頁(yè)
Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)-課件 第5章 數(shù)據(jù)存儲(chǔ)_第3頁(yè)
Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)-課件 第5章 數(shù)據(jù)存儲(chǔ)_第4頁(yè)
Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)-課件 第5章 數(shù)據(jù)存儲(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩88頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章數(shù)據(jù)存儲(chǔ)《Android移動(dòng)開(kāi)發(fā)基礎(chǔ)案例教程(第3版)》

了解數(shù)據(jù)存儲(chǔ)方式,能夠說(shuō)出常用的5種數(shù)據(jù)存儲(chǔ)方式及其特點(diǎn)

掌握SharedPreferences存儲(chǔ)方法,能夠利用SharedPreferences存儲(chǔ)數(shù)據(jù),實(shí)

現(xiàn)保存QQ賬號(hào)與密碼案例

掌握文件存儲(chǔ)方法,能夠利用文件存儲(chǔ)數(shù)據(jù),實(shí)現(xiàn)保存QQ賬號(hào)與密碼案例學(xué)習(xí)目標(biāo)/Target

掌握SQLite數(shù)據(jù)庫(kù)的基本操作,能夠?qū)崿F(xiàn)SQLite數(shù)據(jù)庫(kù)的創(chuàng)建及增、刪、改、查

操作

掌握SQLite數(shù)據(jù)庫(kù)的應(yīng)用,能夠利用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)綠豆通訊錄案例

掌握SQLite數(shù)據(jù)庫(kù)中的事務(wù),能夠通過(guò)SQLite數(shù)據(jù)庫(kù)中的事務(wù)保證數(shù)據(jù)安全學(xué)習(xí)目標(biāo)/Target章節(jié)概述/Summary大部分應(yīng)用程序都會(huì)涉及數(shù)據(jù)存儲(chǔ),Android程序也不例外。Android中的數(shù)據(jù)存儲(chǔ)方式有5種,分別為文件存儲(chǔ)、SharedPreferences存儲(chǔ)、SQLite數(shù)據(jù)庫(kù)存儲(chǔ)、ContentProvider及網(wǎng)絡(luò)存儲(chǔ)。因?yàn)镃ontentProvider與網(wǎng)絡(luò)存儲(chǔ)會(huì)在后續(xù)章節(jié)中講解,所以本章將重點(diǎn)針對(duì)文件存儲(chǔ)、SharedPreferences存儲(chǔ)和SQLite數(shù)據(jù)庫(kù)存儲(chǔ)進(jìn)行講解。目錄/Contents010203數(shù)據(jù)存儲(chǔ)方式文件存儲(chǔ)SharedPreferences存儲(chǔ)04SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)存儲(chǔ)方式5.1

先定一個(gè)小目標(biāo)!了解數(shù)據(jù)存儲(chǔ)方式,能夠說(shuō)出常用的5種數(shù)據(jù)存儲(chǔ)方式及其特點(diǎn)5.1數(shù)據(jù)存儲(chǔ)方式5.1數(shù)據(jù)存儲(chǔ)方式0102030405數(shù)據(jù)存儲(chǔ)在手機(jī)內(nèi)存或SD卡上。適合存儲(chǔ)較大的數(shù)據(jù),如音樂(lè)、圖片、視頻等。提供openFileInput()和openFileOutput()讀取設(shè)備上的文件。以XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備。存儲(chǔ)一些應(yīng)用程序的各種配置信息,如用戶名、密碼等。是自帶的一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),其運(yùn)算速度快、占用資源少,還支持基本SQL語(yǔ)法。開(kāi)發(fā)者一般使用它作為復(fù)雜數(shù)據(jù)的存儲(chǔ)引擎,它可以存儲(chǔ)用戶信息等。主要用于應(yīng)用程序之間的數(shù)據(jù)交換,它可以將自己的數(shù)據(jù)共享給其他應(yīng)用程序使用。它不能單獨(dú)使用,必須與其他數(shù)據(jù)存儲(chǔ)方式結(jié)合使用。網(wǎng)絡(luò)存儲(chǔ)需要與Android網(wǎng)絡(luò)數(shù)據(jù)包打交道,將數(shù)據(jù)存儲(chǔ)到服務(wù)器上,通過(guò)網(wǎng)絡(luò)提供的存儲(chǔ)空間來(lái)存儲(chǔ)或獲取數(shù)據(jù)。文件存儲(chǔ)SharedPreferences存儲(chǔ)SQLite數(shù)據(jù)庫(kù)存儲(chǔ)ContentProvider網(wǎng)絡(luò)存儲(chǔ)5種數(shù)據(jù)存儲(chǔ)方式文件存儲(chǔ)5.2

先定一個(gè)小目標(biāo)!掌握將數(shù)據(jù)存入文件中的方式,能夠根據(jù)需求選擇內(nèi)部存儲(chǔ)或外部存儲(chǔ)實(shí)現(xiàn)數(shù)據(jù)的持久化讀寫操作5.2.1將數(shù)據(jù)存入文件中5.2.1將數(shù)據(jù)存入文件中如何將數(shù)據(jù)存入文件中?5.2.1將數(shù)據(jù)存入文件中在Android開(kāi)發(fā)中,可以使用內(nèi)部存儲(chǔ)或外部存儲(chǔ)的方式將數(shù)據(jù)存入文件中。內(nèi)部存儲(chǔ)是指將應(yīng)用程序中的數(shù)據(jù)以文件的形式存儲(chǔ)到應(yīng)用程序中。外部存儲(chǔ)是指將數(shù)據(jù)以文件的形式存儲(chǔ)到一些外部存儲(chǔ)設(shè)備(例如SD卡或者設(shè)備內(nèi)嵌的存儲(chǔ)卡)上。1.內(nèi)部存儲(chǔ)5.2.1將數(shù)據(jù)存入文件中內(nèi)部存儲(chǔ)使用openFileOutput()方法和openFileInput()方法。FileOutputStreamfos=openFileOutput(Stringname,intmode);FileInputStreamfis=openFileInput(Stringname);(1)openFileOutput()方法:用于打開(kāi)應(yīng)用程序?qū)?yīng)的輸出流,將數(shù)據(jù)存儲(chǔ)到指定的文件中。(2)openFileInput()方法:用于打開(kāi)應(yīng)用程序?qū)?yīng)的輸入流,讀取指定文件中的數(shù)據(jù)。文件名讀寫文件的方式mode的4種取值:MODE_PRIVATE:該文件的內(nèi)容只能被當(dāng)前程序讀寫。MODE_APPEND:該文件的內(nèi)容可以追加。MODE_WORLD_READABLE:該文件的內(nèi)容可以被其他程序讀。MODE_WORLD_WRITEABLE:該文件的內(nèi)容可以被其他程序?qū)憽?.2.1將數(shù)據(jù)存入文件中5.2.1將數(shù)據(jù)存入文件中1.內(nèi)部存儲(chǔ)注意:Android有一套自己的安全模式,默認(rèn)情況下任何應(yīng)用程序創(chuàng)建的文件都是私有的,其他程序無(wú)法操作,除非在文件創(chuàng)建時(shí)指定了操作模式為MODE_WORLD_READABLE或者M(jìn)ODE_WORLD_WRITEABLE。如果希望文件能夠被其他程序進(jìn)行讀寫操作,則需要同時(shí)指定該文件的操作模式為MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。StringfileName="data.txt"; //文件名Stringcontent="helloworld"; //保存數(shù)據(jù)FileOutputStreamfos=null;try{fos=openFileOutput(fileName,MODE_PRIVATE);fos.write(content.getBytes()); }catch(Exceptione){

e.printStackTrace();}finally{}5.2.1將數(shù)據(jù)存入文件中示例存儲(chǔ)數(shù)據(jù)時(shí),使用FileOutputStream對(duì)象將數(shù)據(jù)存儲(chǔ)到文件中。將數(shù)據(jù)寫入文件中2.外部存儲(chǔ)5.2.1將數(shù)據(jù)存入文件中當(dāng)外部設(shè)備可用并且具有讀寫權(quán)限時(shí),通過(guò)FileInputStream對(duì)象和FileOutputStream對(duì)象來(lái)讀寫外部存儲(chǔ)設(shè)備中的文件。注意事項(xiàng):在使用外部存儲(chǔ)設(shè)備之前必須使用Environment.getExternalStorageState()方法確認(rèn)外部存儲(chǔ)設(shè)備是否可用。5.2.1將數(shù)據(jù)存入文件中示例向外部存儲(chǔ)設(shè)備(SD卡)中存儲(chǔ)數(shù)據(jù)。Stringstate=Environment.getExternalStorageState();//獲取SD卡的狀態(tài)if(state.equals(Environment.MEDIA_MOUNTED)){//判斷SD卡是否可用

FileSDPath=Environment.getExternalStorageDirectory();//獲取SD卡路徑

Filefile=newFile(SDPath,"data.txt");Stringdata="HelloWorld";FileOutputStreamfos=null;try{fos=newFileOutputStream(file);fos.write(data.getBytes());}}……}

先定一個(gè)小目標(biāo)!掌握從文件中讀取數(shù)據(jù),能夠?qū)崿F(xiàn)用戶交互的按鈕功能5.2.2從文件中讀取數(shù)據(jù)5.2.2從文件中讀取數(shù)據(jù)如何獲取文件存儲(chǔ)中的數(shù)據(jù)?5.2.2從文件中讀取數(shù)據(jù)在Android開(kāi)發(fā)中,數(shù)據(jù)可以文件形式分別存入內(nèi)部存儲(chǔ)與外部存儲(chǔ)。如需使用這些數(shù)據(jù),則需從對(duì)應(yīng)的文件中進(jìn)行讀取。下面講解如何讀取內(nèi)部存儲(chǔ)文件中的數(shù)據(jù)和外部存儲(chǔ)文件中的數(shù)據(jù)。通過(guò)FileInputStream對(duì)象讀取內(nèi)部存儲(chǔ)文件中的數(shù)據(jù)。Stringcontent="";FileInputStreamfis=null;try{fis=openFileInput("data.txt");

byte[]buffer=newbyte[fis.available()];

fis.read(buffer);

content=newString(buffer);//轉(zhuǎn)換為}catch(Exceptione){e.printStackTrace();}finally{}1.讀取內(nèi)部存儲(chǔ)文件中的數(shù)據(jù)5.2.2從文件中讀取數(shù)據(jù)獲取文件輸入流對(duì)象獲取文件長(zhǎng)度并創(chuàng)建buffer緩沖區(qū)將文件內(nèi)容讀取到buffer緩沖區(qū)首先需要獲取外部存儲(chǔ)設(shè)備(SD卡)的路徑,并通過(guò)該路徑來(lái)讀取對(duì)應(yīng)文件中的數(shù)據(jù)。Stringstate=Environment.getExternalStorageState();if(state.equals(Environment.MEDIA_MOUNTED)){FileSDPath=Environment.getExternalStorageDirectory();

Filefile=newFile(SDPath,"data.txt");

FileInputStreamfis=null;

BufferedReaderbr=null;try{fis=newFileInputStream(file);

br=newBufferedReader(newInputStreamReader(fis));

Stringdata=br.readLine();

}創(chuàng)建文件對(duì)象創(chuàng)建文件輸入流對(duì)象創(chuàng)建字符輸入緩沖流的對(duì)象讀取數(shù)據(jù)5.2.2從文件中讀取數(shù)據(jù)2.讀取外部存儲(chǔ)文件中的數(shù)據(jù)獲取SD卡路徑為保證應(yīng)用安全性,Android要求訪問(wèn)系統(tǒng)關(guān)鍵信息時(shí)必須申請(qǐng)權(quán)限。根據(jù)適配的AndroidSDK版本不同,分為靜態(tài)申請(qǐng)權(quán)限和動(dòng)態(tài)申請(qǐng)權(quán)限。(1)靜態(tài)申請(qǐng)權(quán)限適用場(chǎng)景:適配AndroidSDK6.0(API23)以下版本。實(shí)現(xiàn)方式:在AndroidManifest.xml中聲明權(quán)限。<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>多學(xué)一招申請(qǐng)SD卡的寫權(quán)限靜態(tài)申請(qǐng)SD卡的寫權(quán)限。示例(2)動(dòng)態(tài)申請(qǐng)權(quán)限權(quán)限分類:正常權(quán)限:不涉及用戶隱私(如網(wǎng)絡(luò)訪問(wèn)),只需靜態(tài)聲明危險(xiǎn)權(quán)限:涉及用戶隱私,需靜態(tài)聲明+動(dòng)態(tài)申請(qǐng)。9組危險(xiǎn)權(quán)限:位置(LOCATION)、日歷(CALENDAR)、照相機(jī)(CAMERA)、聯(lián)系人(CONTACTS)、存儲(chǔ)卡(STORAGE)、傳感器(SENSORS)、麥克風(fēng)(MICROPHONE)、電話(PHONE)、短信(SMS)。申請(qǐng)SD卡的寫權(quán)限多學(xué)一招ActivityCompat.requestPermissions(MainActivity.this,newString[]{"android.permission.WRITE_EXTERNAL_STORAGE"},1);上下文需要申請(qǐng)的權(quán)限請(qǐng)求碼申請(qǐng)SD卡的寫權(quán)限動(dòng)態(tài)申請(qǐng)SD卡的寫權(quán)限。示例多學(xué)一招動(dòng)態(tài)申請(qǐng)危險(xiǎn)權(quán)限時(shí),系統(tǒng)會(huì)自動(dòng)彈出對(duì)話框。用戶可選擇:ALLOW:授予權(quán)限,grantResults[i]=PERMISSION_GRANTEDDENY:拒絕權(quán)限,grantResults[i]=PERMISSION_DENIED申請(qǐng)SD卡的寫權(quán)限是否允許訪問(wèn)設(shè)備上照片、媒體和文件的申請(qǐng)權(quán)限多學(xué)一招當(dāng)用戶點(diǎn)擊對(duì)話框中的“ALLOW”按鈕時(shí),程序會(huì)執(zhí)行動(dòng)態(tài)申請(qǐng)權(quán)限的回調(diào)方法onRequestPermissionsResult(),在該方法中可以獲取用戶申請(qǐng)權(quán)限是否成功的信息。申請(qǐng)SD卡的寫權(quán)限@OverridepublicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults){super.onRequestPermissionsResult(requestCode,permissions,grantResults);if(requestCode==1){

onRequestPermissionsResult()方法。示例多學(xué)一招申請(qǐng)SD卡的寫權(quán)限

for(inti=0;i<permissions.length;i++){

if(permissions[i].equals("android.permission.WRITE_EXTERNAL_STORAGE")&&grantResults[i]==PackageManager.PERMISSION_GRANTED){Toast.makeText(this,""+"權(quán)限"+permissions[i]+"申請(qǐng)成功",Toast.LENGTH_SHORT).show();}else{Toast.makeText(this,""+"權(quán)限"+permissions[i]+"申請(qǐng)失敗",Toast.LENGTH_SHORT).show();}}}}多學(xué)一招

先定一個(gè)小目標(biāo)!掌握將數(shù)據(jù)存入文件中的方式,能夠獨(dú)立實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能5.2.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼下面通過(guò)一個(gè)保存QQ賬號(hào)與密碼的案例來(lái)演示如何將數(shù)據(jù)存儲(chǔ)到指定文件中。5.2.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼運(yùn)行結(jié)果5.2.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼保存QQ賬號(hào)與密碼界面創(chuàng)建程序。創(chuàng)建一個(gè)名為SaveQQ的應(yīng)用程序,指定包名為cn.itcast.saveqq。導(dǎo)入界面圖片。導(dǎo)入界面需要的圖片到drawable-hdpi文件夾中。步驟1步驟2實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能放置界面控件。包括放置1個(gè)ImageView控件、2個(gè)TextView控件。放置2個(gè)EditText控件、1個(gè)Button控件。步驟35.2.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼創(chuàng)建工具類。創(chuàng)建FileSaveQQ類,實(shí)現(xiàn)QQ賬號(hào)與密碼的存儲(chǔ)與讀取功能。步驟4編寫界面交互代碼。使用文件存儲(chǔ)的方式,保存與讀取QQ賬號(hào)與密碼信息。步驟5運(yùn)行程序。輸入賬號(hào)和密碼信息,點(diǎn)擊“登錄”按鈕,實(shí)現(xiàn)登錄功能。步驟65.2.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼驗(yàn)證數(shù)據(jù)存儲(chǔ)是否成功:通過(guò)DeviceFileExplorer視圖找到data/data目錄,并在該目錄中找到本程序?qū)?yīng)包名中的data.txt文件。data.txt所在的目錄雙擊data.txt文件,即可在AndroidStudio編輯框中看到data.txt文件中存儲(chǔ)的QQ賬號(hào)與密碼數(shù)據(jù),說(shuō)明數(shù)據(jù)存儲(chǔ)成功。SharedPreferences存儲(chǔ)5.3

先定一個(gè)小目標(biāo)!掌握SharedPreferences存儲(chǔ)方式,能夠?qū)崿F(xiàn)將數(shù)據(jù)存入SharedPreferences中5.3.1將數(shù)據(jù)存入SharedPreferences中SharedPreferences存儲(chǔ)適用場(chǎng)景?5.3.1將數(shù)據(jù)存入SharedPreferences中SharedPreferences是Android平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,當(dāng)程序中有少量數(shù)據(jù)需要持久化存儲(chǔ)時(shí),可以使用SharedPreferences進(jìn)行存儲(chǔ)。例如存儲(chǔ)程序中的用戶名、密碼、自定義的一些參數(shù)等。5.3.1將數(shù)據(jù)存入SharedPreferences中存儲(chǔ)數(shù)據(jù)步驟:5.3.1將數(shù)據(jù)存入SharedPreferences中(1)獲取SharedPreferences對(duì)象SharedPreferencessp=getSharedPreferences("data",MODE_PRIVATE);文件名文件操作模式(2)獲取Editor編輯對(duì)象SharedPreferences.Editoreditor=sp.edit();5.3.1將數(shù)據(jù)存入SharedPreferences中(4)提交數(shù)據(jù)editor.commit();

(3)存入數(shù)據(jù)(鍵值對(duì)形式)editor.putString("name","張三"); //存入String類型數(shù)據(jù)editor.putInt("age",8); //存入Int類型數(shù)據(jù)mit(); //提交存儲(chǔ)的數(shù)據(jù)5.3.1將數(shù)據(jù)存入SharedPreferences中注意:SharedPreferences中的Editor對(duì)象通過(guò)鍵值對(duì)的形式將數(shù)據(jù)保存在data/data/<packagename>/shared_prefs文件夾的XML文件中,其中value值只能是Float、Int、Long、Boolean、String、Set<String>類型的數(shù)據(jù)。

先定一個(gè)小目標(biāo)!掌握SharedPreferences存儲(chǔ)方式,能夠?qū)崿F(xiàn)讀取或刪除SharedPreferences中數(shù)據(jù)的功能5.3.2讀取與刪除SharedPreferences中的數(shù)據(jù)5.3.2讀取與刪除SharedPreferences中的數(shù)據(jù)SharedPreferencessp=getSharedPreferences("data",MODE_PRIVATE)

Stringdata=sp.getString("name","");獲取用戶名信息,第1個(gè)參數(shù)表示用戶名數(shù)據(jù)的key值,第2個(gè)參數(shù)表示缺省值注意:getXxx()方法的第2個(gè)參數(shù)為默認(rèn)值,當(dāng)指定key不存在時(shí)返回該值。讀取SharedPreferences中的數(shù)據(jù),只需要獲取到SharedPreferences對(duì)象,然后通過(guò)該對(duì)象的getXxx()方法獲取到相應(yīng)key的值即可。1.讀取SharedPreferences文件中的數(shù)據(jù)5.3.2讀取與刪除SharedPreferences中的數(shù)據(jù)editor.remove("name");editor.clear();刪除一條數(shù)據(jù)刪除所有數(shù)據(jù)刪除SharedPreferences中的數(shù)據(jù),只需要調(diào)用Editor對(duì)象的remove(Stringkey)方法或者clear()方法即可。2.刪除SharedPreferences文件中的數(shù)據(jù)5.3.2讀取與刪除SharedPreferences中的數(shù)據(jù)使用SharedPreferences的注意事項(xiàng):(1)獲取數(shù)據(jù)的key值與存入數(shù)據(jù)的key值的數(shù)據(jù)類型要一致,否則查找不到指定數(shù)據(jù)。(2)保存SharedPreferences的key值時(shí),可以用靜態(tài)變量保存,以免存儲(chǔ)、刪除時(shí)寫錯(cuò),如privatestaticfinalStringkey="itcast"。注意

先定一個(gè)小目標(biāo)!5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼掌握SharedPreferences存儲(chǔ)方式,能夠獨(dú)立實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能下面使用SharedPreferences存儲(chǔ)方式重新實(shí)現(xiàn)保存QQ賬號(hào)與密碼的功能。5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼運(yùn)行結(jié)果保存QQ賬號(hào)與密碼界面5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼創(chuàng)建工具類。在SaveQQ程序的cn.itcast.saveqq包中創(chuàng)建一個(gè)工具類SPSaveQQ。步驟1實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼//保存QQ賬號(hào)與密碼到data.xml文件中publicstaticbooleansaveUserInfo(Contextcontext,Stringaccount,Stringpassword){//獲取SharedPreferences的對(duì)象spSharedPreferencessp=context.getSharedPreferences("data",Context.MODE_PRIVATE);SharedPreferences.Editoredit=sp.edit();//通過(guò)edit()方法獲取一個(gè)Editor對(duì)象

edit.putString("userName",account);//將QQ賬號(hào)寫入Editor對(duì)象中edit.putString("pwd",password);//將QQ密碼寫入Editor對(duì)象中mit();returntrue;}實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼//從data.xml文件中獲取存儲(chǔ)的QQ賬號(hào)與密碼publicstaticMap<String,String>getUserInfo(Contextcontext){

SharedPreferencessp=context.getSharedPreferences("data",Context.MODE_PRIVATE);Stringaccount=sp.getString("userName",null);//獲取QQ賬號(hào)的數(shù)據(jù)Stringpassword=sp.getString("pwd",null);

//獲取密碼的數(shù)據(jù)

Map<String,String>userMap=newHashMap<String,String>();userMap.put("account",account);userMap.put("password",password);returnuserMap;}編寫界面交互代碼。通過(guò)FileSaveQQ工具類獲取QQ賬號(hào)與密碼的代碼。步驟2實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼Map<String,String>userInfo=SPSaveQQ.getUserInfo(this);在MainActivity中修改通過(guò)FileSaveQQ工具類存儲(chǔ)QQ賬號(hào)與密碼的代碼。booleanisSaveSuccess=SPSaveQQ.saveUserInfo(this,account,password);步驟3運(yùn)行程序。在界面中輸入QQ賬號(hào)與密碼,點(diǎn)擊“登錄”按鈕,會(huì)彈出提示信息“登錄成功”與“保存成功”。<?xmlversion='1.0'encoding='utf-8'standalone='yes'?><map><stringname="userName">100000</string><stringname="pwd">itcast</string></map>5.3.3實(shí)戰(zhàn)演練——保存QQ賬號(hào)與密碼驗(yàn)證數(shù)據(jù)存儲(chǔ)是否成功:通過(guò)DeviceFileExplorer視圖找到shared_prefs目錄,然后找到data.xml文件。data.xml所在的目錄雙擊data.txt文件,查看data.xml文件的具體代碼:SQLite數(shù)據(jù)庫(kù)存儲(chǔ)5.4

先定一個(gè)小目標(biāo)!掌握SQLite數(shù)據(jù)庫(kù)的創(chuàng)建,能夠獨(dú)立創(chuàng)建SQLite數(shù)據(jù)庫(kù)5.4.1SQLite數(shù)據(jù)庫(kù)的創(chuàng)建SQLite數(shù)據(jù)庫(kù)可以存儲(chǔ)應(yīng)用程序中的大量數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行管理和維護(hù),下面我們來(lái)講解SQLite數(shù)據(jù)庫(kù)的創(chuàng)建方式。5.4.1SQLite數(shù)據(jù)庫(kù)的創(chuàng)建在Android中,創(chuàng)建SQLite數(shù)據(jù)庫(kù)只需要?jiǎng)?chuàng)建一個(gè)繼承SQLiteOpenHelper類的類,并在該類中重寫onCreate()方法和onUpgrade()方法即可。5.4.1SQLite數(shù)據(jù)庫(kù)的創(chuàng)建

publicclassMyHelperextendsSQLiteOpenHelper{publicMyHelper(Contextcontext){super(context,"itcast.db",null,2);

}

//數(shù)據(jù)庫(kù)第一次被創(chuàng)建時(shí)調(diào)用,用于初始化表結(jié)構(gòu)

publicvoidonCreate(SQLiteDatabasedb){db.execSQL("CREATETABLEinformation(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR(20),priceINTEGER)");

}//當(dāng)數(shù)據(jù)庫(kù)的版本號(hào)增加時(shí)調(diào)用publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

}}

5.4.1SQLite數(shù)據(jù)庫(kù)的創(chuàng)建context::表示上下文itcast.db:數(shù)據(jù)庫(kù)名稱null:游標(biāo)工廠,此處設(shè)為null2:數(shù)據(jù)庫(kù)版本號(hào)

初始化數(shù)據(jù)庫(kù)的表結(jié)構(gòu),執(zhí)行一條建表的SQL語(yǔ)句在Android系統(tǒng)中,想要查看數(shù)據(jù)庫(kù)中的數(shù)據(jù),需要使用SQLiteExpertPersonal可視化工具。(1)在SQLite官網(wǎng)下載SQLiteExpertPersonal可視化工具并進(jìn)行安裝。多學(xué)一招SQLiteExpertPersonal可視化工具(2)在DeviceFileExplorer視圖中找到數(shù)據(jù)庫(kù)文件所在目錄data/data/項(xiàng)目包名全路徑/databases,數(shù)據(jù)庫(kù)文件itcast.db。多學(xué)一招SQLiteExpertPersonal可視化工具(3)查看數(shù)據(jù)庫(kù)文件itcast.db。右擊itcast.db文件,在彈出的菜單中選擇“SaveAs...”選項(xiàng),將itcast.db文件導(dǎo)出到指定目錄下。在SQLiteExpertPersonal可視化工具中選擇“File”→“OpenDatabase”選項(xiàng),然后選擇需要查看的數(shù)據(jù)庫(kù)文件itcast.db。多學(xué)一招SQLiteExpertPersonal可視化工具

先定一個(gè)小目標(biāo)!掌握SQLite數(shù)據(jù)庫(kù)的基本操作內(nèi)容,能夠?qū)崿F(xiàn)數(shù)據(jù)的增、刪、改、查功能5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作前面介紹了SQLite數(shù)據(jù)庫(kù)的概念及如何創(chuàng)建數(shù)據(jù)庫(kù),接下來(lái)將針對(duì)SQLite數(shù)據(jù)庫(kù)的增、刪、改、查操作進(jìn)行詳細(xì)講解。5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作publicvoidinsert(Stringname,Stringprice){MyHelperhelper=newMyHelper(MainActivity.this);SQLiteDatabasedb=helper.getWritableDatabase();//獲取可讀寫的SQLiteDatabase對(duì)象

ContentValuesvalues=newContentValues();//創(chuàng)建ContentValues對(duì)象

values.put("name",name);

values.put("price",price);

longid=db.insert("information",null,values);

db.close();}使用SQLiteDatabase類的insert()方法可以向表中插入一條數(shù)據(jù)。插入一條數(shù)據(jù)到information表中將數(shù)據(jù)添加到ContentValues對(duì)象中1.新增數(shù)據(jù)向information表中插入一條數(shù)據(jù)。示例5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作insert()方法包含3個(gè)參數(shù),具體如下。第1個(gè)參數(shù)是數(shù)據(jù)庫(kù)表的名稱。第2個(gè)參數(shù)表示,如果發(fā)現(xiàn)將要插入的行為空行,會(huì)將這個(gè)參數(shù)的值設(shè)為null。第3個(gè)參數(shù)為ContentValues對(duì)象。需要注意的是,ContentValues類類似于Map類,它會(huì)通過(guò)鍵值對(duì)的形式插入數(shù)據(jù),這里的鍵值對(duì)中的key表示插入數(shù)據(jù)的列名,value表示要插入的數(shù)據(jù)。注意:使用完SQLiteDatabase對(duì)象后一定要調(diào)用close()方法關(guān)閉數(shù)據(jù)庫(kù)連接,否則數(shù)據(jù)庫(kù)連接會(huì)一直存在,不斷消耗內(nèi)存,當(dāng)系統(tǒng)內(nèi)存不足時(shí)將獲取不到SQLiteDatabase對(duì)象,并且會(huì)拋出數(shù)據(jù)庫(kù)未關(guān)閉的異常。5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作publicintdelete(longid){ SQLiteDatabasedb=helper.getWritableDatabase();intnumber=db.delete("information","_id=?",newString[]{id+""});db.close();returnnumber;}使用SQLiteDatabase類的delete()方法,可以刪除數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。2.刪除數(shù)據(jù)刪除information表中的某一條數(shù)據(jù)。示例5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作publicintupdate(Stringname,Stringprice){ SQLiteDatabasedb=helper.getWritableDatabase();ContentValuesvalues=newContentValues();values.put("price",price);

//調(diào)用update()方法來(lái)修改數(shù)據(jù)庫(kù)表中對(duì)應(yīng)的數(shù)據(jù)intnumber=db.update("information",values,"name=?",newString[]{name});db.close();returnnumber;}適用SQLiteDatabase類的update()方法,可以修改數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。將修改的數(shù)據(jù)添加到values對(duì)象中3.修改數(shù)據(jù)修改information表中的某一條數(shù)據(jù)。示例5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作update()方法包含4個(gè)參數(shù),具體如下。第1個(gè)參數(shù)表示數(shù)據(jù)庫(kù)表的名稱。第2個(gè)參數(shù)表示最新的數(shù)據(jù)。第3個(gè)參數(shù)表示要修改的數(shù)據(jù)的查詢條件。第4個(gè)參數(shù)表示查詢條件的參數(shù)。5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作使用SQLiteDatabase類的query()方法,可以查詢數(shù)據(jù)庫(kù)表中的數(shù)據(jù),該方法返回的是一個(gè)行數(shù)集合Cursor,Cursor是一個(gè)游標(biāo)接口,提供了遍歷查詢結(jié)果的方法。需要注意的是,在使用完Cursor后,一定要及時(shí)將其關(guān)閉,否則會(huì)造成內(nèi)存泄露。4.查詢數(shù)據(jù)5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作查詢information表中的數(shù)據(jù)。示例publicvoidfind(intid){

MyHelperhelper=newMyHelper(MainActivity.this);SQLiteDatabasedb=helper.getReadableDatabase();Cursorcursor=db.query("information",null,"_id=?",newString[]{id+""},null,null,null);if(cursor.getCount()!=0){while(cursor.moveToNext()){//移動(dòng)游標(biāo)指向下一行數(shù)據(jù)String_id=cursor.getString(cursor.getColumnIndex("_id"));Stringname=cursor.getString(cursor.getColumnIndex("name"));

Stringprice=cursor.getString(cursor.getColumnIndex("price"));

}}

cursor.close();//關(guān)閉Cursor

db.close();}判斷cursor中是否有數(shù)據(jù),如果沒(méi)有,就不要進(jìn)入循環(huán)獲取數(shù)據(jù)5.4.2SQLite數(shù)據(jù)庫(kù)的基本操作query()方法包含7個(gè)參數(shù),具體如下。第1個(gè)參數(shù)表示表名稱。第2個(gè)參數(shù)表示查詢的列名。第3個(gè)參數(shù)表示接收查詢條件的子句。第4個(gè)參數(shù)表示接收查詢條件的子句對(duì)應(yīng)的條件值。第5個(gè)參數(shù)表示分組方式。第6個(gè)參數(shù)用于接收having條件(定義組的過(guò)濾器)。第7個(gè)參數(shù)表示排序方式。使用execSQL()方法通過(guò)SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。使用SQL語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)操作多學(xué)一招//新增一條數(shù)據(jù)db.execSQL("insertintoinformation(name,price)values(?,?)",newObject[]{name,price});//刪除一條數(shù)據(jù)db.execSQL("deletefrominformationwhere_id=1");//修改一條數(shù)據(jù)db.execSQL("updateinformationsetname=?whereprice=?",newObject[]{name,price});//執(zhí)行查詢的SQL語(yǔ)句Cursorcursor=db.rawQuery("select*frominformationwherename=?",newString[]{name});

先定一個(gè)小目標(biāo)!掌握SQLite數(shù)據(jù)庫(kù)中的事務(wù),能夠通過(guò)SQLite數(shù)據(jù)庫(kù)中的事務(wù)保證數(shù)據(jù)安全5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)數(shù)據(jù)庫(kù)事務(wù)是一個(gè)對(duì)數(shù)據(jù)庫(kù)執(zhí)行工作的單元,是針對(duì)數(shù)據(jù)庫(kù)的一組操作,它可以由一條或多條SQL語(yǔ)句組成。事務(wù)是以邏輯順序完成的工作單位或序列,可以由用戶手動(dòng)完成,也可以由某種數(shù)據(jù)庫(kù)程序自動(dòng)完成。SQLite是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),ACID是指事務(wù)正確執(zhí)行的四個(gè)基本要素。5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)一致性原子性隔離性持久性4個(gè)基本要素的介紹如下:原子性:表示事務(wù)是一個(gè)不可再分割的工作單位或序列,事務(wù)中的操作要么全部成功,要么全部失敗回滾。一致性:表示事務(wù)開(kāi)始之前和結(jié)束之后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。也就是說(shuō)事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性及業(yè)務(wù)邏輯的一致性。隔離性:表示并發(fā)的事務(wù)是相互隔離的,也就是一個(gè)事務(wù)內(nèi)部的操作都必須封鎖起來(lái),不被其他事務(wù)影響。持久性:表示事務(wù)一旦提交,該事務(wù)對(duì)數(shù)據(jù)做的更改便持久保存在數(shù)據(jù)庫(kù)中,并不會(huì)被回滾,即使出現(xiàn)了斷電等事故,也不會(huì)影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)。5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)使用SQLite數(shù)據(jù)庫(kù)中的事務(wù)模擬銀行轉(zhuǎn)賬功能。當(dāng)張三拿著一張銀行卡在銀行準(zhǔn)備取出1000元時(shí),王五在銀行準(zhǔn)備將自己的1000元存入銀行卡。示例5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)PersonSQLiteOpenHelperhelper=newPersonSQLiteOpenHelper(getApplication());SQLiteDatabasedb=helper.getWritableDatabase();db.beginTransaction();//開(kāi)啟數(shù)據(jù)庫(kù)事務(wù)try{

db.execSQL("updatepersonsetaccount=account-1000wherename=?",newObject[]{"張三"});

db.execSQL("updateinformationsetaccount=account+1000wherename=?",newObject[]{"王五"});db.setTransactionSuccessful();//標(biāo)記數(shù)據(jù)庫(kù)事務(wù)執(zhí)行成功}catch(Exceptione){Log.i("事務(wù)執(zhí)行失敗",e.toString());}finally{

db.endTransaction();//關(guān)閉事務(wù)

db.close();//關(guān)閉數(shù)據(jù)庫(kù)}執(zhí)行取出操作執(zhí)行存入操作5.4.3SQLite數(shù)據(jù)庫(kù)中的事務(wù)注意:事務(wù)操作完成后一定要使用endTransaction()方法關(guān)閉事務(wù)。當(dāng)執(zhí)行endTransaction()方法時(shí),首先會(huì)檢查是否有事務(wù)執(zhí)行成功的標(biāo)記,有則提交數(shù)據(jù),無(wú)則回滾數(shù)據(jù),最后關(guān)閉事務(wù)。如果不關(guān)閉事務(wù),事務(wù)只有在超時(shí)后才自動(dòng)結(jié)束,這樣會(huì)降低數(shù)據(jù)庫(kù)并發(fā)效率。因此,通常關(guān)閉事務(wù)的操作會(huì)在finally中執(zhí)行。

先定一個(gè)小目標(biāo)!掌握SQLite數(shù)據(jù)庫(kù)的創(chuàng)建與基本操作,能夠獨(dú)立實(shí)現(xiàn)綠豆通訊錄界面效果5.4.4實(shí)戰(zhàn)演練——綠豆通訊錄下面通過(guò)一個(gè)綠豆通訊錄的案例對(duì)SQLite數(shù)據(jù)庫(kù)在開(kāi)發(fā)程序中的應(yīng)用進(jìn)行詳細(xì)講解。5.4.4實(shí)戰(zhàn)演練——綠豆通訊錄5.4.4實(shí)戰(zhàn)演練——綠豆通訊錄綠豆通訊錄界面創(chuàng)建程序。創(chuàng)建一個(gè)名為Directory的應(yīng)用程序,指定包名為cn.itcast.directory。步驟1實(shí)現(xiàn)綠豆通訊錄功能5.4.4實(shí)戰(zhàn)演練——綠豆通訊錄導(dǎo)入界面圖片。導(dǎo)入界面需要的圖片到drawable-hdpi文件夾中。步驟2放置界面控件。包括放置3個(gè)TextView控件、放置2個(gè)EditText控件、放置4個(gè)Button控件。步驟3編寫界面交互代碼。在MainActivity中編寫邏輯代碼,實(shí)現(xiàn)添加、查詢、修改及刪除聯(lián)系人信息的功能。步驟4實(shí)現(xiàn)綠豆通訊錄功能5.4.4實(shí)戰(zhàn)演練——綠豆通訊錄添加聯(lián)系人信息的核心代碼caseR.id.btn_add://添加數(shù)據(jù)

name=mEtName.getText().toString();phone=mEtPhone.getText().toString();db=myHelper.getWritableDatabase();//獲取可讀寫的SQLiteDatabase對(duì)象

values=newContentValues();//創(chuàng)建ContentValues對(duì)象

values.put("name",name);

溫馨提示

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

評(píng)論

0/150

提交評(píng)論