Android中我們的應用程序中有少量的數據要保存,而且這些數據的格式很簡單,是一些普通的字符串、基本的數據類型,比如:應用程序的各種配置信息(如:是否打開同步,是否打開音響,是否使用振動等),游戲的玩家積分等,我們可以用Android提供的SharedPreferences進行保存。當應用程序有大量數據需要存儲、訪問,就需要借助於數據庫了,Android內置了SQLite數據庫,一個輕量級的數據庫,它沒有後台進程,整個數據庫就對應一個文件。
接下來簡單介紹一下SharedPreferences和SQLite
數據存儲:
一、SharedPreferences
Preference簡介:
Preference:輕量級的數據存儲方法,應用場合主要是數據比較少的配置信息。 它以“鍵-值”(是一個Map)對的方式將數據保存在一個XML配置文件中。
使用Preference 方式來存儲數據,用到了SharePreferences接口和SharedPreferences的一個內部接口SharedPreferences.Editor,這兩個接口在android.content包中。
調用Context.getSharedPreferences(String name,int mode)方法得到SharedPreferences接口。該方法的第一個參數是文件名稱,第二個參數是操作模式。操作模式一共有三種:MODE_PRIVATE(私有)、MODE_WORLD_READAVLE(可讀)和MODE_WORLD_WRITEABLE(可寫)。SharedPreferences提供了獲得數據的方法,如getString(String key,String defValue)、getInt(String key,int defValue)等。
調用SharedPreferences的edit()方法返回SharedPreferences.Editor內部接口,該接口中提供了保存數據的方法,如putString(String key,String value)、putInt(String key,int value)等,調用該接口的commit()方法可以將數據進行保存。
1. SharedPreferences
SharedPreferences保存的數據主要是類似於配置信息格式的數據,因此塔保存的數據主要是簡單類型的Key-Value對。
SharedPreferences接口主要負責讀取應用程序的Preferences數據,它提供了如下方法來訪問SharedPreferences中鍵值對。
a. boolean contains(String key):判斷SharedPreferences是否包含特定的數據。
b. abstract Map<String,?> getAll():獲取SharedPreferences數據裡全部的鍵值對
c. boolean getXxx(String key,xxx defValue):獲取SharedPreferences數據裡指定的key對應的value.如果該key不存在,返回默認值defValue。
SharedPreferences接口本身並沒有提供寫入數據的能力,而是通過SharedPreferences的內部接口,SharedPreferences調用edit()方法即可獲取它所對應的Editor對象。
Editor提供了如下方法向SharedPreferences寫入數據:
a. SharedPreferences.Editor clear():清空SharedPreferences裡面的數據。
b. SharedPreferences.Editor putXxx(String key,xxx value): 向SharedPreferences存入指定的Key對應的數據。
c. SharedPreferences.Editor remove(String key):刪除SharedPreferences裡指定key對應的數據項。
d. boolean commit():當Editor編輯完成後,調用該方法提交修改。
SharedPreferences本身是一個接口,程序無法直接創建SharedPerences實例,只能通過Context提供的getSharedPreences(String name,int mode)方法來獲取SharedPreferences實例,該方法的第二個參數有如下幾個值:
a. Context.MODE_PREIVATE:指定該SharedPreferences數據只能被本應用程序讀寫。
b. Context.MODE_WORLD_READABLE:指定該SharedPreferences數據能被其他應用程序讀,但不能寫。
c. Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences數據能被其他應用程序讀、寫。
2. 讀寫其他程序的SharedPreferences
前提是創建該SharedPreferences的應用程序指定相應的訪問權限,例如:指定MODE_WORLD_READABLE:表明該SharedPreferences可被其他的應用程序讀取。指定了MODE_WORLD_WRITABLE:表明該SharedPreferences可被其他程序寫入。
一個SharedPreferences讀取另一個權限為MODE_WORLD_READABLE模式的SharedPreferences時的步驟:
a. 需要創建其他程序對應的Context,例如:useCount = createPackageContext("com.infy.io",Context.CONTEXT_IGNORE_SECURITY);//其中com.infy.io為其他程序的包名(Android系統的包名來 作為該程序的標識的)
b. 調用其他應用程序的Context的getSharedPreferences(String name,int mode)即可獲取相應的SharedPreferences對象。
c. 如果需要向其他應用的SharedPreferences數據寫入數據,調用SharedPreferences的edit方法獲取相應的Editor即可。
如果開發者不通過先獲取其他應用程序的Context,再獲取SharedPreferences的方式也可讀取SharedPreferences數據,也可以完全可以使用IO流的方式讀取SharedPreferences對應的XML文件,再通過XML解析來獲取數據也是可行的,只是這種方式沒有SharedPreferences來讀寫簡單。
3. File存儲
Android支持以IO流的方式來訪問手機存儲器上的文件。
Context提供了兩個方法來打開本應用的數據文件夾裡的文件IO流。
a. FileInputStream openFileInput(String name):打開應用程序的數據文件夾下的name文件對應的輸入流。
b. FileOutputStream openFileOutput(String name,int mode):打開應用程序的數據文件夾下的name文件對應的輸出流。
其中第二個方法的二個參數指定打開文件的模式,有如下值:
MODE_PRIVATE:該文件只能被當前程序讀寫。
MODE_APPEND:以追加的方式打開該問價,應用程序可以向該文件中追加內容。
MODE_WORLD_READABLE:該文件的內容可以被其他程序讀取。
MODE_WORLD_WRITEABLE:該文件的內容可以由其他程序讀寫。
Context還提供了如下幾個方法來訪問應用程序的數據文件夾:
a. getDir(String name,int mode):在應用程序的數據文件夾下獲取或創建name對應的子目錄。
b. File getFilesDir():獲取該應用程序的數據文件夾得絕對路徑。
c. String[] fileList():返回該應用程序的數據文件夾下的全部文件。
d. deleteFile(String):刪除該應用程序的數據文件夾下的指定文件。
4. 讀寫SD卡上的文件:
為了更好的存、取應用程序的大文件,應用程序需要讀、寫SD卡上的文件。
讀、寫SD上的文件步驟:
a. 調用Environment的getExternalStorageState()方法判斷手機上是否插入了SD卡,並且應用程序具有讀寫SD卡的權限。
例如:Environment.getExternalStorageSate().equals(Environment.MEDIA_MOUNTED)//如果手機已插入SD卡,且應用程序具有讀寫SD卡的能力,則返回true.
b. 調用Environment的getExternalStorageDirectory()方法來獲取外部存儲器、也就是SD卡的目錄
c. 使用FileInputStream、FileOutStram、FileReader或FileWriter讀、寫SD卡裡的文件。
(讀寫SD數據,必須在應用程序的清單文件中添加讀寫SD卡的權限:<user-permissin android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>//在SD卡中創建於刪除文件權限
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>//向SD卡寫入數據權限)