一、文件存儲
1.將數(shù)據(jù)存儲到文件中
Android中的文件存儲機(jī)制是一種基本的存儲數(shù)據(jù)的方式,其不對數(shù)據(jù)進(jìn)行任何格式化的處理,所以這種方式適用于存儲一些簡單的文本數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)。
Context中提供一個openFileOutput()的方法,將數(shù)據(jù)存儲在指定的文件下;該方法實(shí)現(xiàn)傳入兩個數(shù)據(jù)參數(shù),
其中一個是參數(shù)是文件名,注意這里的文件名不可以包含路徑,它的默認(rèn)訊儲存位置是、data/datta/<package>files/下面 的。
第二個是文件的操作模式,其數(shù)值有兩種,默認(rèn)的是MODE_PRIVATE表示當(dāng)指定的文件名相同時,寫入的數(shù)據(jù)會覆蓋源文件中的內(nèi)容;另一個是MODE_APPEND表示的是如果文件夾下存在相同的文件名,則是往文件里追加內(nèi)容;其實(shí)本來是的操作,模式有四個,其他兩個MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE,由于這兩個模式允許其他的程序操作文件,所以在以前的版本就取消了。
2.從文件中讀取數(shù)據(jù)
類似于將數(shù)據(jù)存儲到文件中,Context?類中還提供了一個openFileInput()方法,用于從文件中讀取數(shù)據(jù)。這個方法要比openFile0utput()簡單-?-些,它只接收-一個參數(shù),?即要讀取的文件名,然后系統(tǒng)會自動到/data/data/files/目錄?下去加載這個文件,并返回一個FileInputStream對象,得到了這個對象之后再通過Java流的方式就可以將數(shù)據(jù)讀取出來了。以下是一段簡單的代碼示例,展示了如何從文件中讀取文本數(shù)據(jù):
public?String?load()?{
FileInputStream?in?=?null;
BufferedReader?reader?=?null;
St?ringBuilder?content?=?new?St?ringBuilder();
try?{
in?=?openFileInput("data");
reader?=?new?BufferedReader?(new?InputSt?reamReader(in));
String?line?=?"";
while?((line?=?reader.?readLine())?!=?null)?{
content?.?append(line);
}?catch?(IOException?e)?{
e,?printStackTrace();
}?finally?{
if?(reader?!=?null}?{
try?{
reader?.?close();
}?catch?(IOException?e)?{
e.?printStackTrace();
}
return?content.?toString();
在這段代碼中,首先通過openFileInput()方法獲取到了一個FileInputStream對象,然后借助它又構(gòu)建出了一個InputStreamReader對象,接著再使用InputStreamReader構(gòu)建出一個BufferedReader對象,這樣我就可以通過BufferedReader?進(jìn)行-?-行行地讀取,把文件中所有的文本內(nèi)容全部讀取出來,并存放在一一個StringBuilder對象中,最后將讀取到的內(nèi)容返回就可以了。
二、SharedPreferences存儲
1.將數(shù)據(jù)存儲到SharePreferences中
首先需要拿到SharedPreferences對象
主要有三種方法:
(1)Context類通過getSharedPreferences()方法
第一個參數(shù)指定了文件名,如果不存在則會創(chuàng)建一個SharedPreferences所有的文件都是存放在 /data/data/包名/shared_prefs/ 目錄下,第二個參數(shù)指定操作模式,MODE_PRIVATE和0效果一樣,代表只允許當(dāng)前程序進(jìn)行讀寫
(2)Activity類中g(shù)etPreferences()方法
只接收一個操作模式作為參數(shù),因?yàn)槭褂眠@個方法會自動將當(dāng)前類名作為SharedPreferences文件名
(3)PreferenceManager類中的getDefaultSharedPreferences()方法
這是一個靜態(tài)方法,接收一個Context參數(shù),并自動使用當(dāng)前包名作為前綴來命名SharedPreferences。
保存數(shù)據(jù)主要分三步:
(1)調(diào)用SharedPreferences對象的edit()方法來得到SharedPreferences.Editor對象
(2)向SharedPreferences.Editor添加數(shù)據(jù)
字符串類型用putString() 、布爾類型用putBoolean(),以此類推
(3)調(diào)用apply()提交,完成保存操作
2.從SharePreferences中讀取數(shù)據(jù)
SharedPreferences讀取數(shù)據(jù)更為簡單
SharedPreferences提供了一系列g(shù)et方法,每種都對應(yīng)了SharedPreferences.Editor中的一種put方法
讀取字符串可以用getString()
讀取布爾型數(shù)據(jù)可以用getBoolean()
接收2個參數(shù):
第一個參數(shù)是鍵值,與保存?zhèn)魅氲逆I值對應(yīng)
第二個參數(shù)是默認(rèn)值,當(dāng)傳入的鍵值讀取不到數(shù)據(jù)的時候,就用默認(rèn)值
三、SQLite存儲
1.創(chuàng)建數(shù)據(jù)庫
Android 提供了SQLiteOpenHelper幫助我們對數(shù)據(jù)庫進(jìn)行創(chuàng)建和升級,它是一個抽象類,我們需要創(chuàng)建一個類去繼承它,同時重寫OnCreate和onUpgrade方法,用于創(chuàng)建和升級數(shù)據(jù)庫。
SQLiteOpenHelper有兩個重要的實(shí)例方法:
都是用于創(chuàng)建一個數(shù)據(jù)庫 或者 打開一個現(xiàn)有的數(shù)據(jù)庫并返回一個可對數(shù)據(jù)庫進(jìn)行讀寫操作的對象。
區(qū)別在于:
getReadableDatabase()在數(shù)據(jù)庫不可寫入的時候,如磁盤空間已滿,則返回的對象將以只讀的方式去打開數(shù)據(jù)庫
而getWritableDatabase()將會出現(xiàn)異常(我們常用后者,即getWritableDatabase)。
SQLiteOpenHelper有兩個構(gòu)造方法可供重寫,一般使用參數(shù)少一點(diǎn)的那個構(gòu)造方法,有4個參數(shù):
第一個參數(shù)是 Context
第二個參數(shù)是 數(shù)據(jù)庫名,創(chuàng)建數(shù)據(jù)庫的時候?qū)⑹褂眠@個名字命名
第三個參數(shù)允許我們在查詢數(shù)據(jù)的時候返回一個自定義的Cursor,一般傳入null
第四個參數(shù)是 數(shù)據(jù)庫版本號,可用于對數(shù)據(jù)庫進(jìn)行升級操作。
構(gòu)建出SQLiteOpenHelper的實(shí)例后,再調(diào)用它的getReadableDatabase()或getWritableDatabase()就完成了創(chuàng)建數(shù)據(jù)庫,且重寫的onCreate()方法也會被一起執(zhí)行。
2.升級數(shù)據(jù)庫
主要利用onUpgrade()方法進(jìn)行數(shù)據(jù)庫升級。
3.添加數(shù)據(jù)庫
在布局文件中加入一個按鈕用于添加數(shù)據(jù)。
<Button
? ? ? ? android:id="@+id/add_data"? ? ? ? android:layout_width="match_parent"? ? ? ? android:layout_height="wrap_content"? ? ? ? android:text="添加數(shù)據(jù)" />
接著在MainActivity里加入點(diǎn)擊事件
1 首先拿到SQLiteDatabase 對象。
2 然后使用ContentValues 提供的put方法來組裝每一條數(shù)據(jù)(組裝多條數(shù)據(jù)的時候,記得每次使用完畢后使用clear()清理values,然后繼續(xù)使用)。
3 最后調(diào)用SQLiteDatabase 的insert()方法插入到表中。
第一個參數(shù)是要插入的表名。
第二個參數(shù)用于在未指定添加數(shù)據(jù)的情況下可以給某些可以為空的列自動賦值NULL,一般我們用不到這個功能,直接傳入null即可。
第三個參數(shù)是我們組裝好的ContentValues。
4.更新數(shù)據(jù)庫
在布局中加入一個按鈕用于更新數(shù)據(jù)
然后在MainActivity里加入更新數(shù)據(jù)的點(diǎn)擊事件。
使用SQLiteDatabase 的update()方法來用于更新操作。
第一個參數(shù)指定表名。
第二個參數(shù)是我們組裝好的ContentValues。
第三個參數(shù)是占位符,對應(yīng)SQL的where語句,表示所有name等于?的行,而?是一個占位符,由第四個參數(shù)去指定
第四個參數(shù)即用數(shù)組來指定限制內(nèi)容,即name = "The Da Vinci Code"的所有數(shù)據(jù)。
5.刪除數(shù)據(jù)庫
在布局中加入一個按鈕用于更新數(shù)據(jù)。
然后在MainActivity里加入更新數(shù)據(jù)的點(diǎn)擊事件。
直接調(diào)用SQLiteDatabase 的delete()方法
第一個參數(shù)表名
第二個和第三個參數(shù)為約束條件
這里指明想要刪除pages>500的所有數(shù)據(jù)
6.查詢數(shù)據(jù)
首先在布局里加入一個按鈕用來查詢數(shù)據(jù)。
接著在MainActivity里加入查詢點(diǎn)擊事件。
1 首先使用SQLiteDatabase 的query()方法,第一個參數(shù)指明去查詢Book表,后面的參數(shù)全設(shè)置為null,則代表查詢這個表的所有數(shù)據(jù)。
2 查詢完以后后得到一個Cursor對象,接著我們調(diào)用它的moveToFirst()將數(shù)據(jù)指針移動到第一行,然后一行一行去查詢數(shù)據(jù),而cursor.getColumnIndex()是去拿指定列的索引,然后拿到對應(yīng)的值。
完成后,記得關(guān)閉Cursor。