數(shù)據(jù)不管對(duì)于用戶還是對(duì)于公司都是很重要的豆励,所以數(shù)據(jù)的存儲(chǔ)也是相當(dāng)?shù)闹匾健D阍囅胍幌拢绻粋€(gè)應(yīng)用沒有做數(shù)據(jù)存儲(chǔ)埂息,那將會(huì)何等的可怕技潘?尤其是用戶體驗(yàn)極差。
官方文檔:https://developer.android.com/guide/topics/data/data-storage?hl=zh-cn
分類
1.sharedPreferences
2.文件存儲(chǔ)(可分為內(nèi)部和外部存儲(chǔ))
3.數(shù)據(jù)庫存儲(chǔ)
4.網(wǎng)絡(luò)存儲(chǔ)
而至于網(wǎng)上所說的contentProvider千康,這是Android提供的一種可將自己的隱私數(shù)據(jù)暴露出去的方法享幽,而非真正的數(shù)據(jù)存儲(chǔ)方式。
SharedPreferences
這是一種輕量級(jí)的存儲(chǔ)方案拾弃,通常用于存儲(chǔ)一些登陸的信息或者開關(guān)之類的鍵值對(duì),它是將鍵值對(duì)保存到xml文件中值桩,一般用于存放一些格式簡(jiǎn)單且少量的數(shù)據(jù)。
用法也很簡(jiǎn)單:
// TODO 存儲(chǔ)數(shù)據(jù)
// SharedPreferences preferences = getPreferences(MODE_PRIVATE);
SharedPreferences sp = getSharedPreferences("sp_file", MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putBoolean("login", true);
edit.putString("login_name", "pioneerz");
edit.apply();
// TODO 獲取數(shù)據(jù)
boolean login = sp.getBoolean("login", false);
String loginName = sp.getString("login_name", "");
注:不建議多進(jìn)程間使用這種方式共享數(shù)據(jù)豪椿,這是不安全的奔坟。
文件存儲(chǔ)
文件存儲(chǔ)分為內(nèi)部和外部存儲(chǔ)。他的優(yōu)勢(shì)在于只要空間足夠大搭盾,就可以存放大數(shù)據(jù)咳秉,而且也不限制格式。
1.內(nèi)部存儲(chǔ)通常是將數(shù)據(jù)存儲(chǔ)在應(yīng)用的私有目錄下鸯隅,比如通過openFileOutput打開或創(chuàng)建的文件會(huì)放在的應(yīng)用的/data/data/<package name>/files目錄下滴某。這些文件在應(yīng)用被刪除的時(shí)候也會(huì)跟著刪除的,如果有root手機(jī),可以直接通過adb命令去查看:
用法:
public void writeCache(View view) {
try {
File file = new File(getCacheDir(), "cache_test");
FileOutputStream fos = new FileOutputStream(file);
fos.write("write cache".getBytes());
fos.close();
mTextView.setText("寫入緩存成功");
} catch (IOException e) {
mTextView.setText("寫入緩存失敗霎奢,原因:"+e.getMessage());
}
}
public void readCache(View view) {
try {
File file = new File(getCacheDir(), "cache_test");
FileInputStream fis = new FileInputStream(file);
int available = fis.available();
byte[] result = new byte[available];
fis.read(result);
fis.close();
mTextView.setText("讀取緩存:"+(new String(result)));
} catch (IOException e) {
mTextView.setText("讀取緩存失敗户誓,原因:"+e.getMessage());
}
}
上面使用cat命令查看文件的內(nèi)容,得到的也是"Hello world".
2.外部存儲(chǔ)通常是將數(shù)據(jù)存放到內(nèi)置的sd卡或者外置的sd卡中幕侠。這些文件是不會(huì)隨著應(yīng)用的刪除而刪除帝美,所以要注意管理。注意從6.0開始晤硕,訪問外部存儲(chǔ)是需要讀寫權(quán)限的(android.permission.WRITE_EXTERNAL_STORAGE)悼潭,而且在存儲(chǔ)數(shù)據(jù)之前是需要判斷外部存儲(chǔ)的狀態(tài)是否可以可用。
/* Checks if external storage is available for read and write */
public boolean isExternalStorageAvailable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
至于代碼就不寫了哈舞箍!
數(shù)據(jù)庫存儲(chǔ)
數(shù)據(jù)庫存儲(chǔ)是目前很常見的一種存儲(chǔ)舰褪,因?yàn)樗坏梢源鎯?chǔ)數(shù)據(jù),還提供的很方便的數(shù)據(jù)查詢疏橄,更新占拍,刪除,插入捎迫,就是我們通常所說的crud晃酒, 也很高效。
使用:
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
其實(shí)現(xiàn)在有很多更"好"的數(shù)據(jù)庫的框架窄绒,比如greendao贝次,liteOrm等,用起來非常的方便彰导,不像原始的那樣的要自己去寫命令去crud蛔翅,他們只是簡(jiǎn)單的調(diào)用相應(yīng)的函數(shù)就行,當(dāng)然簡(jiǎn)單的同時(shí)是用性能作為犧牲的位谋,而且是用久了搁宾,會(huì)造成開發(fā)者思維的固化,連最基礎(chǔ)的sql語句都不太會(huì)了倔幼,當(dāng)數(shù)據(jù)庫出現(xiàn)問題盖腿,也沒能力去排查問題了 。
網(wǎng)絡(luò)存儲(chǔ)
像瀏覽器中的書簽同步和恢復(fù):點(diǎn)擊同步的時(shí)候损同,它是將數(shù)據(jù)打包存放到自己的服務(wù)器上的翩腐,以防止數(shù)據(jù)誤刪或者丟失,當(dāng)用戶點(diǎn)擊恢復(fù)的時(shí)候膏燃,它會(huì)將服務(wù)器上的數(shù)據(jù)下載下來并顯示茂卦。