




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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中讀取/寫入文件的方法,與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)用程序的各種配置信息,例如用戶名、密碼、網(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ǔ)用戶信息等。6.2 文件存儲(chǔ)6.2.1 文件存儲(chǔ)簡(jiǎn)介文件存儲(chǔ)是Android種最基本的一種數(shù)據(jù)存儲(chǔ)方式,與Java中的文件存儲(chǔ)存儲(chǔ)類似,都是通過(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類中提供的openFileOutput()方法和openFileInput()兩個(gè)方法,通過(guò)這兩個(gè)方法可以分別獲取FileOutputStream對(duì)象和FileInputStream對(duì)象,然后進(jìn)行讀寫操作:openFileOutput()用于打開應(yīng)用程序中對(duì)應(yīng)的輸出流,將數(shù)據(jù)存儲(chǔ)到指定的文件中;openFileInput()用于打開應(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(); 寫入過(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ù)用戶個(gè)人隱私,
7、添加了運(yùn)行時(shí)權(quán)限:分為兩類,一類是Normal Permissions,這類權(quán)限不涉及個(gè)人隱私,不需要用戶進(jìn)行授權(quán),比如手機(jī)震動(dòng),訪問(wèn)網(wǎng)絡(luò);一類是Dangerous Permissions,這類權(quán)限涉及個(gè)人隱私,需要用戶進(jìn)行授權(quán),比如讀取SD卡,訪問(wèn)通訊錄等。Android系統(tǒng)為了保證應(yīng)用程序的安全做了相應(yīng)規(guī)定,如果程序需要訪問(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ǔ)類,也是最容易理解和使用的存儲(chǔ)技術(shù)。主要用來(lái)存儲(chǔ)程序的配置參數(shù),例如用戶名、密碼、自定義參數(shù)的設(shè)置。區(qū)別于文件的存儲(chǔ)方式,SharedPref
10、erences是使用鍵值對(duì)的方式將數(shù)據(jù)存儲(chǔ)到XML文件中來(lái)保存數(shù)據(jù)的。該文件位于data/data/shared_prefs文件夾中。SharedPreferences支持多種不同數(shù)據(jù)類型存儲(chǔ),包括Float、Int、Long、Boolean、String、StringSet類型。6.3 SharedPreferences存儲(chǔ)6.3.1 將數(shù)據(jù)存儲(chǔ)到SharedPreferences中Android中提供了3種方法用于得到SharedPreferences對(duì)象:Context類中的getSharedPreferences()方法Activity類中的getPreferences()方法Pref
11、erenceManager類中的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)了記住密碼功能案例代碼(詳見教材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è)置用戶名和密碼就可以使用。它還能夠支持Windows/Linux/UNIX等主流操作系統(tǒng),能夠跟很多程序語(yǔ)言,例如Tcl、C#、PHP、Java等結(jié)合。6.4 SQLite數(shù)
15、據(jù)庫(kù)存儲(chǔ)SQLite沒有服務(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ù)類型,同時(shí)還接收varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類型,但是在運(yùn)算或保存的時(shí)候會(huì)轉(zhuǎn)換成對(duì)應(yīng)的5種數(shù)據(jù)類型。6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)6.4.1 創(chuàng)建數(shù)據(jù)庫(kù)Android為了讓我們能夠更加方便的管理數(shù)據(jù)庫(kù),專門提供了一個(gè)SQLiteOpenHelper數(shù)據(jù)庫(kù)幫助類,借助這個(gè)類可以簡(jiǎn)單對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)。 SQLiteOpenHel
16、per是一個(gè)抽象類,因此我們要使用的話需要?jiǎng)?chuàng)建自己的幫助類去繼承它SQLiteOpenHelper中還有兩個(gè)非常重要的實(shí)例方法:getReadableDatabase()和getWrit-ableDatabase()6.4 SQLite數(shù)據(jù)庫(kù)存儲(chǔ)在新建的項(xiàng)目中創(chuàng)建MyDatabaseHelper類繼承自SQLiteOpenHelper類,重寫抽象方法并在構(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é)生姓名 文本類型 + stuNo text, /學(xué)號(hào) 文本類型 + stuAge integer, /年齡 + stuMajor text); /專業(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)在如果我們需要添加一張表用于記錄圖書分類:首先確定創(chuàng)建表Category的SQL語(yǔ)句接下來(lái),我們將上述語(yǔ)句添加到剛才創(chuàng)建的自定義幫助類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(); / 開始組裝第一條數(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 查詢數(shù)據(jù)數(shù)據(jù)庫(kù)中SQL查詢涉及的內(nèi)容很多,SQLiteDatabase中提供了一個(gè)query()方法用于對(duì)數(shù)據(jù)進(jìn)行查詢,這個(gè)方法中最短的方法重載需要傳入7個(gè)參數(shù)。Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); / 查詢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)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025股東之間的股權(quán)轉(zhuǎn)讓合同范本
- 2025標(biāo)準(zhǔn)個(gè)人售房合同協(xié)議書
- 2025跨國(guó)服務(wù)貿(mào)易合同規(guī)范
- 2025存量房買賣的合同樣本
- 2025天津市經(jīng)濟(jì)適用住房買賣合同
- 2025大連煤炭產(chǎn)品代理合同范本
- 2025屆畢業(yè)生簽訂就業(yè)協(xié)議應(yīng)注意合同細(xì)節(jié)
- 2025《基站建設(shè)合同施工》
- 2025年躉購(gòu)電合同示范文本及范例
- 2025授權(quán)炒股合同示例
- 2024遼寧沈陽(yáng)水務(wù)集團(tuán)有限公司招聘20人筆試參考題庫(kù)附帶答案詳解
- 建筑工地物業(yè)服務(wù)合同模板7篇
- 《計(jì)算機(jī)發(fā)展史》課件
- 2025年安徽蕪湖市陽(yáng)光電力維修工程有限責(zé)任公司招聘筆試參考題庫(kù)附帶答案詳解
- 人教版英語(yǔ)七年級(jí)下冊(cè)知識(shí)講義Unit 1 section A (教師版)
- 快開門式壓力容器操作人員培訓(xùn)
- 2024-2025學(xué)年統(tǒng)編版語(yǔ)文八年級(jí)上冊(cè)期末易錯(cuò)題:現(xiàn)代文閱讀(記敘文)(含答案)
- 手術(shù)分級(jí)管理制度
- 2025年江蘇宿遷經(jīng)濟(jì)技術(shù)開發(fā)區(qū)人力資源有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025-2030年中國(guó)聚氨酯產(chǎn)業(yè)市場(chǎng)風(fēng)險(xiǎn)評(píng)估規(guī)劃研究報(bào)告
- 學(xué)校食堂每日食品安全檢查記錄臺(tái)賬(日管控)
評(píng)論
0/150
提交評(píng)論