Android 數(shù)據(jù)存儲

一、文件存儲

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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容