所有的應用程序都必然涉及數據的輸入與輸出。在Android系統中,主要有五種數據存儲模式:
1 .Sharedferences:Sharedferences是一種輕型的數據存儲方式,本質上是基于XML文件存儲key-value鍵值對數據。通常用來存儲一些簡單的配置信息;
2 .File:使用文件進行數據存儲;
3 .SQLite:SQLite是一個輕量級的數據庫,存儲結構化的數據,支持基本SQL語法,是常被采用的一種數據存儲方式。Android為SQLite提供了一個名為SQLiteDatabase的類,封裝了一些CRUD操作的API;
4 .ContentProvider:ContentProvider為存儲和獲取數據提供統一的接口,可以在不同的應用程序之間共享數據;
5 .Network:使用基于網絡的服務獲取數據。
其中,前四種為本地數據持久化的存儲方式。
當應用程序只有少量數據需要保存,而且這些數據的格式很簡單,譬如都是String、Int、Long、Float和Boolean等簡單數據類型時,可以使用SharedPreferences來保存,常用于保存應用程序的各種配置信息(是否使用振動效果、字體大小等);
當應用程序只有少量數據需要保存,而且這些數據的格式比較復雜,可以使用普通文件保存;
當應用程序有大量數據需要存儲和訪問,就可以使用SQLite數據庫來保存。SQLite是一個真正輕量級的數據庫,它沒有后臺進程,整個數據庫就對應于一個文件;
當應用程序需要引用其他應用程序如多媒體播放、通訊錄等的數據時,可以使用ContentProvider來調用數據接口;
當應用程序需要的數據需要跨設備和持久保存,就不能保存在本地,而應該采用網絡服務器存儲數據。
本文主要講解SharedPreferences的使用與應用。
一. SharedPreferences的重要方法
1 . 讀取SharedPreferences數據的方法
方法描述
boolean contains (String key)判斷SharedPreferences是否包含特定key的數據。
abstract MapgetAll()獲取SharedPreferences數據中全部的鍵值對數據集合。
abstract Xxx getXxx(String key, Xxx defaultValue)獲取SharedPreferences數據里指定key對應的value。如果key不存在,則返回defaultValue。其中,Xxx可以是boolean、int、float、long、String。
abstract SetgetStringSet(String key, SetdefValues)獲取SharedPreferences數據中指定key對應的Set值。
2. 向SharedPreferences寫入數據的方法
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過通過SharedPreferences的內部接口SharedPreferences.Editor實現的。SharedPreferences調用edit()方法即可獲取它對應的Editor對象。其中Editor對象向SharedPreferences寫入數據的方法如下:
方法描述
abstract SharedPreferences.Editor
putXxx(String key, Xxx value)向Editor對象存入指定key對應的value數據。其中,Xxx可以是boolean、int、float、long、String。
abstract SharedPreferences.Editor
clear()清空Editor對象中的數據。
abstract SharedPreferences.Editor
remove(String key)刪除Editor對象中指定的key對應的數據。
abstract SharedPreferences.Editor
putStringSet(String key, Setvalues)向Editor對象存入指定key對應的Set值。
abstract boolean commit()當Editor對象編輯完成后,調用該方法提交修改。
abstract void apply()提交Editor對象的修改。
二. 向SharedPreferences中存儲數據
SharedPreferences本身是一個接口,不能直接創建SharedPreferences實例,可以通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences實例。其中,該方法中的mode參數可取的值有:
Context.MODE_PRIVATE:指定SharedPreferences數據只能被本應用程序讀、寫;
Context.MODE_WORLD_READABLE:指定SharedPreferences可被其他應用程序讀,但不能寫;
Context.MODE_WORLD_WRITABLE:指定SharedPreferences數據可被其他應用程序讀、寫。
實現SharedPreferences存儲的步驟如下:
1 . 創建SharedPreferences對象;
2 . 創建SharedPreferences.Editor對象,用于存儲數據修改;
3 . 通過Editor對象的putXxx()方法,存儲key-value對數據信息;
4 . 通過Editor對象的commit()方法提交對SharedPreferences的修改。
實例如下:
/*
* 創建SharedPreferences實例
* 其中"myPref"指SharedPreferences數據的XML文件名
* 指定該SharedPreferences數據只能被本應用程序讀寫
*/SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE);// 創建SharedPreferences.Editor對象,用于存儲數據修改SharedPreferences.Editor editor = pref.edit();// 存儲數據信息editor.putString("name","zhangsan");editor.putInt("age",22);editor.putLong("time", System.currentTimeMillis());editor.putBoolean("default",true);// 提交數據修改editor.commit();
這樣就完成了SharedPreferences的數據寫入了。
在Android Studio的DDMS中可以查看"myPref"XML文件信息。myPref.xml所在的文件目錄為 "/data/data/<包名>/shared_prefs/myPref.xml" 。DDMS的打開步驟如下:
"Tools"菜單 ->"Android"菜單 ->"Android Device Monitor"菜單,即可打開DDMS。
在DDMS中查看Android虛擬機下對應的"/data/data/<包名>/shared_prefs/myPref.xml",并導出myPref.xml至本地電腦中查看,可看到myPref.xml文件內容如下:
zhangsan
三. 讀取本應用程序的SharedPreferences
所有創建的SharedPreferences數據都可以被本應用訪問并進行讀寫操作。
實現SharedPreferences讀取的步驟如下:
1 . 獲取SharedPreferences對象;
2 . 獲取SharedPreferences中的數據。
// 1. 獲取SharedPreferences對象SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE);// 2. 取出數據String name = pref.getString("name","defaultName");Intage = pref.getInt("age",0);Longtime = pref.getLong("time",0);Booleandefault= pref.getBoolean("default",true);
四. 讀寫其他應用程序的SharedPreferences數據
要讀寫其他應用程序的SharedPreferences,前提是該應用程序的SharedPreferences需要指定相應權限,如Context.MODE_WORLD_READABLE(可讀,不可寫)、Context.MODE_WORLD_WRITABLE(可讀寫)。
假設要讀取的應用程序的的SharedPreferences數據具有Context.MODE_WORLD_WRITABLE權限。為了讀取該應用程序的的SharedPreferences,步驟如下:
第一步:創建其他應用程序對應的Context
創建其他應用程序對應的Context的方法如下:
createPackageContext(StringpackageName,intflags)
其中packageName為該應用程序的包名。flag表示該應用程序的安全限制標記。flag的取值如下:
CONTEXT_INCLUDE_CODE:可以執行程序包里的代碼;
CONTEXT_IGNORE_SECURITY:忽略安全警告;
CONTEXT_RESTRICTED:嚴格模式,可能導致一些特殊特性不可用;
示例:
otherAppContext= createPackageContext("cn.edu.sysu.ce.hope", Context.CONTEXT_IGNORE_SECURITY);
第2步:調用其它應用程序的Context的SharedPreferences對象
// 獲取SharedPreferences對象SharedPreferences pref = otherAppContext.getSharedPreferences("myPref", MODE_PRIVATE);
第3步:向SharedPreferences對象中讀寫數據
1 . 讀取數據:
String name = pref.getString("name","defaultName");Intage = pref.getInt("age",0);Longtime = pref.getLong("time",0);Booleandefault= pref.getBoolean("default",true);
2 . 寫入數據:
// 獲取SharedPreferences.Editor對象,用于存儲數據修改SharedPreferences.Editor editor = pref.edit();// 修改數據信息editor.putString("name","lisi");editor.putBoolean("isMale",true);// 提交數據修改editor.commit();
因為SharedPreferences的數據存儲格式就是一個XML文件,所以我們完全可以通過使用I/O流的方式讀取該XML文件,再通過XML解析來獲取數據。但是顯然,這種方式是很繁瑣,而是用SharedPreferences讀寫數據則簡單很多。