Android基礎(chǔ)程序設(shè)計(jì)第六章-數(shù)據(jù)存儲(chǔ)_第1頁(yè)
Android基礎(chǔ)程序設(shè)計(jì)第六章-數(shù)據(jù)存儲(chǔ)_第2頁(yè)
Android基礎(chǔ)程序設(shè)計(jì)第六章-數(shù)據(jù)存儲(chǔ)_第3頁(yè)
Android基礎(chǔ)程序設(shè)計(jì)第六章-數(shù)據(jù)存儲(chǔ)_第4頁(yè)
Android基礎(chǔ)程序設(shè)計(jì)第六章-數(shù)據(jù)存儲(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第六章 數(shù)據(jù)存儲(chǔ)6.1 數(shù)據(jù)存儲(chǔ)方式6.5實(shí)戰(zhàn)演練手機(jī)通訊錄6.3 SharedPreferences存儲(chǔ)6.6 小結(jié)6.2 文件存儲(chǔ)6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.1 數(shù)據(jù)存儲(chǔ)方式 Android平臺(tái)提供3種數(shù)據(jù)存儲(chǔ)方式文件存儲(chǔ):是一種較常用的方法,在Android中讀取/寫(xiě)入文件的方法,與Java中實(shí)現(xiàn)I/O程序是完全一樣的,提供openFileInput()和openFileoutput()方法來(lái)讀取設(shè)備上的文件??梢杂脕?lái)存儲(chǔ)大數(shù)據(jù),如文本、圖片、音頻和視頻等。SharedPreferences:是Android提供的用來(lái)存儲(chǔ)一些簡(jiǎn)單配置信息的一種機(jī)制,采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備

2、中。一般用來(lái)存儲(chǔ)應(yīng)用程序的各種配置信息,例如用戶(hù)名、密碼、網(wǎng)絡(luò)配置信息等。SQLite數(shù)據(jù)庫(kù):SQLite是Android自帶的一個(gè)輕量級(jí)數(shù)據(jù)庫(kù),支持SQL標(biāo)準(zhǔn)語(yǔ)法,利用很少的內(nèi)存就有很好的性能,一般使用它作為復(fù)雜數(shù)據(jù)的存儲(chǔ)引擎,可以存儲(chǔ)用戶(hù)信息等。6.2 文件存儲(chǔ)6.2.1 文件存儲(chǔ)簡(jiǎn)介文件存儲(chǔ)是Android種最基本的一種數(shù)據(jù)存儲(chǔ)方式,與Java中的文件存儲(chǔ)存儲(chǔ)類(lèi)似,都是通過(guò)I/O流的形式把數(shù)據(jù)直接存儲(chǔ)到文檔中。不同的是,Android中的文件存儲(chǔ)分為內(nèi)部存儲(chǔ)和外部存儲(chǔ)6.2 文件存儲(chǔ)6.2.2 文件存儲(chǔ)在內(nèi)部?jī)?nèi)部存儲(chǔ)是指將應(yīng)用程序中的數(shù)據(jù)以文件方式存儲(chǔ)到設(shè)備內(nèi)部(默認(rèn)存儲(chǔ)到/data/d

3、ata/files/目錄下)內(nèi)部存儲(chǔ)方式存儲(chǔ)的文件被其所創(chuàng)建的應(yīng)用程序私有,如果其他應(yīng)用程序要操作本程序中的文件,需要設(shè)置權(quán)限。當(dāng)創(chuàng)建的應(yīng)用程序被卸載時(shí),其內(nèi)部存儲(chǔ)文件也隨之被刪除。6.2 文件存儲(chǔ)內(nèi)部存儲(chǔ)使用的是Context類(lèi)中提供的openFileOutput()方法和openFileInput()兩個(gè)方法,通過(guò)這兩個(gè)方法可以分別獲取FileOutputStream對(duì)象和FileInputStream對(duì)象,然后進(jìn)行讀寫(xiě)操作:openFileOutput()用于打開(kāi)應(yīng)用程序中對(duì)應(yīng)的輸出流,將數(shù)據(jù)存儲(chǔ)到指定的文件中;openFileInput()用于打開(kāi)應(yīng)用程序?qū)?yīng)的輸入流,讀取指定文件中的

4、數(shù)據(jù);其中參數(shù)“name”表示文件名,“mode”表示文件操作模式:MODE_PRIVATE是默認(rèn)的操作模式MODE_APPEND則表示如果該文件已存在,就往文件里面追加內(nèi)容FileOutputStream fos = openFileOutput(String name,int mode);FileInputStream fin = openFileInput(String name);6.2 文件存儲(chǔ)/創(chuàng)建輸出流 FileOutputStream fos; /通過(guò)輸出流將數(shù)據(jù)保存 try/使用OpenFileOutput方法獲取文件對(duì)象 fos = openFileOutput(data.

5、txt,MODE_APPEND); fos.write(saveInfo.getBytes(); fos.close(); catch(Exception e) e.printStackTrace(); 寫(xiě)入過(guò)程:讀取過(guò)程: /讀取過(guò)程 try /通過(guò)輸入流將文件都取進(jìn)來(lái)FileInputStream fin = openFileInput(data.txt);byte buffer = new bytefin.available(); fin.read(buffer); content = new String(buffer); fin.close(); catch(Exception e)

6、 e.printStackTrace(); 6.2 文件存儲(chǔ)6.2.3 文件存儲(chǔ)在外部?jī)?nèi)部存儲(chǔ)是指將應(yīng)用程序中的數(shù)據(jù)以文件方式存儲(chǔ)到設(shè)備內(nèi)部(默認(rèn)存儲(chǔ)到/data/data/files/目錄下)內(nèi)部存儲(chǔ)方式存儲(chǔ)的文件被其所創(chuàng)建的應(yīng)用程序私有,如果其他應(yīng)用程序要操作本程序中的文件,需要設(shè)置權(quán)限。當(dāng)創(chuàng)建的應(yīng)用程序被卸載時(shí),其內(nèi)部存儲(chǔ)文件也隨之被刪除。6.2 文件存儲(chǔ)由于外部存儲(chǔ)設(shè)備可能被移除、丟失或處于其他狀態(tài),因此在使用外部設(shè)備之前必須使用Environment的getExternalStorageState()方法來(lái)確認(rèn)外部設(shè)備是否可用Android 6.0之后系統(tǒng)為了更好的保護(hù)用戶(hù)個(gè)人隱私,

7、添加了運(yùn)行時(shí)權(quán)限:分為兩類(lèi),一類(lèi)是Normal Permissions,這類(lèi)權(quán)限不涉及個(gè)人隱私,不需要用戶(hù)進(jìn)行授權(quán),比如手機(jī)震動(dòng),訪(fǎng)問(wèn)網(wǎng)絡(luò);一類(lèi)是Dangerous Permissions,這類(lèi)權(quán)限涉及個(gè)人隱私,需要用戶(hù)進(jìn)行授權(quán),比如讀取SD卡,訪(fǎng)問(wèn)通訊錄等。Android系統(tǒng)為了保證應(yīng)用程序的安全做了相應(yīng)規(guī)定,如果程序需要訪(fǎng)問(wèn)系統(tǒng)的一些關(guān)鍵信息,必須要在清單文件中聲明權(quán)限才可以,否則程序運(yùn)行時(shí)會(huì)直接崩潰6.2 文件存儲(chǔ)首先在活動(dòng)中調(diào)用onCreate()方法前聲明運(yùn)行時(shí)權(quán)限組:在onCreate()方法調(diào)用時(shí),進(jìn)行build版本比對(duì)并授予運(yùn)行時(shí)權(quán)限:private static String

8、 PERMISSION_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ; /請(qǐng)求狀態(tài)碼 private static int REQUEST_PERMISSION_CODE = 2;if(Build.VERSION.SDK_INTBuild.VERSION_CODES.LOLLIPOP) if(ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_

9、EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)ActivityCompat.requestPermissions(MainActivity.this,PERMISSION_STORAGE,REQUEST_PERMISSION_CODE); 6.2 文件存儲(chǔ)最后在清單文件中添加權(quán)限:6.3 SharedPreferences存儲(chǔ)SharedPreferences是Android平臺(tái)上一個(gè)輕量級(jí)存儲(chǔ)類(lèi),也是最容易理解和使用的存儲(chǔ)技術(shù)。主要用來(lái)存儲(chǔ)程序的配置參數(shù),例如用戶(hù)名、密碼、自定義參數(shù)的設(shè)置。區(qū)別于文件的存儲(chǔ)方式,SharedPref

10、erences是使用鍵值對(duì)的方式將數(shù)據(jù)存儲(chǔ)到XML文件中來(lái)保存數(shù)據(jù)的。該文件位于data/data/shared_prefs文件夾中。SharedPreferences支持多種不同數(shù)據(jù)類(lèi)型存儲(chǔ),包括Float、Int、Long、Boolean、String、StringSet類(lèi)型。6.3 SharedPreferences存儲(chǔ)6.3.1 將數(shù)據(jù)存儲(chǔ)到SharedPreferences中Android中提供了3種方法用于得到SharedPreferences對(duì)象:Context類(lèi)中的getSharedPreferences()方法Activity類(lèi)中的getPreferences()方法Pref

11、erenceManager類(lèi)中的getDefaultSharedPreferences()方法將數(shù)據(jù)存儲(chǔ)到SharedPreferences文件中:SharedPreferences.Editor editor = getSharedPreferences(data,MODE_PRIVATE).edit(); editor.putString(name,Tom); editor.putInt(age,28); editor.putBoolean(married,false); editor.apply();6.3 SharedPreferences存儲(chǔ)6.3.2從SharedPreferenc

12、es中讀取數(shù)據(jù)SharedPreferences對(duì)象中提供了一系列的get方法,用于讀取數(shù)據(jù);每種get方法都對(duì)應(yīng)了SharedPreferences.Editor中的一種put方法;get方法都要接收兩個(gè)參數(shù),第一個(gè)參數(shù)是鍵,即存儲(chǔ)對(duì)應(yīng)數(shù)據(jù)時(shí)使用的鍵值;第二個(gè)參數(shù)是默認(rèn)值,表示當(dāng)傳入的鍵值找不到對(duì)應(yīng)值時(shí)會(huì)以什么樣的默認(rèn)值返回。 SharedPreferences pref = getSharedPreferences(data,MODE_PRIVATE); String name = pref.getString(name,); int age = pref.getInt(age,0); b

13、oolean married = pref.getBoolean(married,false); String info = name is : +name+n+age is :+age+ n +married is :+married;6.3 SharedPreferences存儲(chǔ)6.3.3 實(shí)戰(zhàn)演練23功能描述:技術(shù)要點(diǎn):編輯布局編輯邏輯代碼,用來(lái)記住配置文件使用SharedPreferences技術(shù)實(shí)現(xiàn)了記住密碼功能案例代碼(詳見(jiàn)教材P132P135)實(shí)現(xiàn)步驟: 實(shí)現(xiàn)記住密碼功能使用SharedPreferences存儲(chǔ)配置信息,通過(guò)SharedPreferences讀取存儲(chǔ)的配置信息。

14、16.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)Android系統(tǒng)提供了SQLite數(shù)據(jù)庫(kù),可以用來(lái)存儲(chǔ)大量的數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行管理和維護(hù)。SQLite是一款輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),運(yùn)算速度非???,占用資源很少,通常只需要幾百KB的內(nèi)存就足夠,因此適合在移動(dòng)設(shè)備上使用。SQLite不僅支持標(biāo)準(zhǔn)的SQL語(yǔ)法,還遵循數(shù)據(jù)庫(kù)的ACID事務(wù),只要之前使用過(guò)其他關(guān)系型數(shù)據(jù)庫(kù),就可以很快上手SQLite,且SQLite比一般的數(shù)據(jù)庫(kù)要簡(jiǎn)單的多,它不需要設(shè)置用戶(hù)名和密碼就可以使用。它還能夠支持Windows/Linux/UNIX等主流操作系統(tǒng),能夠跟很多程序語(yǔ)言,例如Tcl、C#、PHP、Java等結(jié)合。6.4 SQLite數(shù)

15、據(jù)庫(kù)存儲(chǔ)SQLite沒(méi)有服務(wù)器進(jìn)程,通過(guò)文件保存數(shù)據(jù),該文件是跨平臺(tái)的,可以放在其他平臺(tái)中使用。保存數(shù)據(jù)時(shí),支持null(零)、integer(整數(shù))、real(浮點(diǎn)數(shù)字)、text(字符串文本)和blob(二進(jìn)制對(duì)象)5種數(shù)據(jù)類(lèi)型,同時(shí)還接收varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類(lèi)型,但是在運(yùn)算或保存的時(shí)候會(huì)轉(zhuǎn)換成對(duì)應(yīng)的5種數(shù)據(jù)類(lèi)型。6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.1 創(chuàng)建數(shù)據(jù)庫(kù)Android為了讓我們能夠更加方便的管理數(shù)據(jù)庫(kù),專(zhuān)門(mén)提供了一個(gè)SQLiteOpenHelper數(shù)據(jù)庫(kù)幫助類(lèi),借助這個(gè)類(lèi)可以簡(jiǎn)單對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)。 SQLiteOpenHel

16、per是一個(gè)抽象類(lèi),因此我們要使用的話(huà)需要?jiǎng)?chuàng)建自己的幫助類(lèi)去繼承它SQLiteOpenHelper中還有兩個(gè)非常重要的實(shí)例方法:getReadableDatabase()和getWrit-ableDatabase()6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)在新建的項(xiàng)目中創(chuàng)建MyDatabaseHelper類(lèi)繼承自SQLiteOpenHelper類(lèi),重寫(xiě)抽象方法并在構(gòu)造方法中創(chuàng)建數(shù)據(jù)表Studentpublic class MyDatabaseHelper extends SQLiteOpenHelper public static final String CREATE_STUDENT= create

17、table Student ( + id integer primary key autoincrement, /主鍵自增長(zhǎng) + stuName text, /學(xué)生姓名 文本類(lèi)型 + stuNo text, /學(xué)號(hào) 文本類(lèi)型 + stuAge integer, /年齡 + stuMajor text); /專(zhuān)業(yè) private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) super(contex

18、t, name, factory, version); mContext = context; Override public void onCreate(SQLiteDatabase db) db.execSQL(CREATE_STUDENT); Toast.makeText(mContext, 恭喜數(shù)據(jù)庫(kù)創(chuàng)建成功!, Toast.LENGTH_SHORT).show(); Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.2 升級(jí)數(shù)據(jù)庫(kù)My

19、DatabaseHelper中還有一個(gè)方法onUpgrade(),這個(gè)方法主要完成數(shù)據(jù)庫(kù)的升級(jí)操作例如現(xiàn)在如果我們需要添加一張表用于記錄圖書(shū)分類(lèi):首先確定創(chuàng)建表Category的SQL語(yǔ)句接下來(lái),我們將上述語(yǔ)句添加到剛才創(chuàng)建的自定義幫助類(lèi)MyDatabaseHelper中create table Category (id integer primary key autoincrement,category_name text,category_code integer)6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)public class MyDatabaseHelper extends SQLiteOpen

20、Helper Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) db.execSQL(drop table if exists Student); db.execSQL(drop table if exists Category); onCreate(db); onUpgrade()方法中執(zhí)行了兩條drop語(yǔ)句,表示如果數(shù)據(jù)庫(kù)中存在Student表或Category表則將這兩張表刪除,然后調(diào)用onCreate()方法重新創(chuàng)建。6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.3 添加數(shù)據(jù)調(diào)用S

21、QLiteOpenHelper的getReadableDatabase()和getWritableDatabase()方法可以用于創(chuàng)建和升級(jí)數(shù)據(jù)庫(kù),同時(shí),這兩個(gè)方法還會(huì)返回一個(gè)SQLiteDatabase對(duì)象,借助這個(gè)對(duì)象,我們可以完成數(shù)據(jù)庫(kù)的增、刪、查操作。 public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); / 開(kāi)始組裝第一條數(shù)據(jù) values.put(stuName, Lucy Wang); v

22、alues.put(stuNo, 0201170101); values.put(stuAge, 18); values.put(stuMajor, Software Engineering); db.insert(Student, null, values); / 插入第一條數(shù)據(jù) values.clear(); 6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.4 更新數(shù)據(jù)SQLiteDatabase數(shù)據(jù)庫(kù)提供了一個(gè)好用的方法uodate(),用于對(duì)數(shù)據(jù)進(jìn)行更新,這個(gè)方法接收4個(gè)參數(shù),第一個(gè)參數(shù)和前面insert()方法一樣,表示要更新哪張表中的數(shù)據(jù)。第二個(gè)參數(shù)是ContentValues對(duì)象,要把更新

23、數(shù)據(jù)組裝進(jìn)去。第三、第四個(gè)參數(shù)用于約束更新某一行或某幾行的數(shù)據(jù),不指定時(shí)指更新所有行。 Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(stuMajor, Software Engineering); db.update(Student, values, stuName = ?, new String Jone Dou ); 6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6

24、.4.5 刪除數(shù)據(jù)接下來(lái)我們通過(guò)學(xué)習(xí)SQLiteDatabase的delete()方法學(xué)習(xí)如何從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù),這個(gè)方法很簡(jiǎn)單,在方法中只接受3個(gè)參數(shù),第一個(gè)參數(shù)仍然是表名,第二、第三個(gè)參數(shù)用來(lái)指明刪除某一行或某幾行的數(shù)據(jù),不指定默認(rèn)情況下就是刪除所有行。 Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete(Student, stuAge ?, new String 18 ); 6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.6 查詢(xún)數(shù)據(jù)數(shù)據(jù)庫(kù)中SQL查詢(xún)涉及的內(nèi)容很多,SQLiteDatabase中提供了一個(gè)query()方法用于對(duì)數(shù)據(jù)進(jìn)行查詢(xún),這個(gè)方法中最短的方法重載需要傳入7個(gè)參數(shù)。Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); / 查詢(xún)Book表中所有的數(shù)據(jù) Cursor cursor = db.query(Student, null, null

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論