14天學會安卓開發(第七天)資料儲存之SharedPreferences與檔案

查志強發表於2014-06-25

【原文:http://blog.csdn.net/corder_raine/article/details/8310130

14天學會安卓開發  
作者:神祕的N (英文名  corder_raine)
聯絡方式:369428455(反饋)
交流群:284552167(示例,原文件下載)
版權為作者所有,如有轉載請註明出處
目錄

第七天.SharedPreferences與檔案... 79
7.1 SharedPreferences 79

7.1.1資料儲存方式... 79
7.1.2 SharedPreferences 79
7.1.3 SharedPreferences儲存資料... 80
7.1.4訪問SharedPreferences資料... 81

7.2 不同應用共享資料... 81

7.2.1 訪問其他應用SharedPreferences資料... 81

7.3 Android檔案操作... 82

7.3.1 檔案儲存... 82
7.3.2讀檔案操作... 82
7.3.3 寫檔案操作... 82
7.3.4讀取靜態檔案... 82
7.3.5使用檔案進行資料儲存... 83
7.3.6 讀取檔案內容... 83

7.4 SDCard檔案存取... 84

7.4.1 把檔案存放在SDCard. 84

第七天.SharedPreferences與檔案
7.1 SharedPreferences       
7.1.1資料儲存方式
課程安排
  Shared Preferences
  儲存到檔案
  SQLite資料庫
  儲存到網路
  內容提供者(Content provider)

7.1.2 SharedPreferences
  如何儲存軟體配置引數:
  Window: 採用ini檔案進行
  j2se應用: 採用properties屬性檔案
  Android平臺提供一個SharedPreferences類,它是一個輕量級的儲存類,適合用於儲存軟體配置引數。
  使用SharedPreferences儲存資料,其背後是用xml檔案存放資料,檔案存放在/data/data//shared_prefs目錄下

7.1.3 SharedPreferences儲存資料
1
2
3
4
5
SharedPreferences sharedPreferences =getSharedPreferences("lxt008", Context.MODE_PRIVATE);
Editor editor =sharedPreferences.edit();//獲取編輯器
editor.putString("name","lxt");
editor.putInt("age",35);
editor.commit();//提交修改
生成的lxt008.xml檔案內容如下:
1
2
3
4
5
<?xml version=“1.0” encoding=“utf-8” standalone=“yes” ?>
<map>
<string name="name">lxt</string>
<intname="age"value=“30" />
</map>

  getSharedPreferences(name,mode)方法
  引數1:指定該檔名稱,名稱不用帶字尾。
  引數2:指定檔案的操作模式,共有四種操作模式。


1     Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用
2     Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
3-1  Context.MODE_WORLD_READABLE和
       Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。
4-1  MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;
4-2  MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。


  getPreferences(mode)方法操作SharedPreferences,這個方法預設使用當前類不帶包名的類名作為檔案的名稱。
  android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。
  預設情況下,應用建立的檔案/sharedpreferences/資料庫都應該是私有的(位於/data/data/包名),其他程式無法訪問。
  除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。

7.1.4訪問SharedPreferences資料
  訪問SharedPreferences中的資料程式碼如下:
1
2
3
4
SharedPreferences sharedPreferences =getSharedPreferences("lxt008", Context.MODE_PRIVATE);
//getString()第二個引數為預設值,如果preference中不存在該key,將返回預設值
String name =sharedPreferences.getString("name","");
intage = sharedPreferences.getInt("age",1);
7.2 不同應用共享資料

7.2.1 訪問其他應用SharedPreferences資料
  訪問其他應用Preference,前提條件是:該preference建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE。
  getSharedPreferences(“lxt008", Context.MODE_WORLD_READABLE);
  其他應用要訪問上面應用的preference,首先需要建立上面應用的Context,然後通過Context訪問preference,訪問preference時會在應用所在包下的shared_prefs目錄找到preference :
1
2
3
4
Context otherAppsContext =createPackageContext(“com.lxt008", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences =otherAppsContext.getSharedPreferences(“lxt008", Context.MODE_WORLD_READABLE);
String name =sharedPreferences.getString("name","");
intage =sharedPreferences.getInt("age",0);



Shared Preferences案例
  參考:SharedPreferencesMidiPlayer

結果驗證
  切換到DDMS檢視
  選擇File Explorer標籤
  /data/data/你的專案目錄/shared_prefs


7.3 Android檔案操作

7.3.1 檔案儲存
  檔案可以儲存比使用引用更大數量的資料
   Android 提供方法來讀、寫檔案
  只有本地檔案可以被訪問
  優點:可以儲存大容量的資料
  缺點:檔案更新或是格式改變可能會導致巨大的程式設計工作

7.3.2讀檔案操作
  Context.openFileInput(String name)
  開啟一個與應用程式聯絡的私有檔案輸入流
  當檔案不存在時丟擲FileNotFoundException
1
2
3
FileInputStream in = this.openFileInput("test.txt");//開啟檔案test.txt
……
in.close();//關閉輸入流
7.3.3 寫檔案操作
  Context.openFileOutput(String name,int mode)
  開啟一個與應用程式聯絡的私有檔案輸出流
  當檔案不存在時該檔案將被建立
  檔案輸出流可以在新增模式中開啟,這意味新的資料將被新增到檔案的末尾
1
2
3
FileOutputStream out=this.openFileOutput("test2.txt",MODE_APPEND);//開啟檔案"test2.txt"進行寫操作、使用MODE_APPEND 在新增模式中開啟檔案
……
out.close();//關閉輸出流
7.3.4讀取靜態檔案
  要開啟打包在程式中的靜態檔案,使用Resources.openRawResource(R.raw.mydatafile)
  該檔案必須放在資料夾res/raw/中
1
2
3
InputStreamin = this.getResources().openRawResource(R.raw.my);
  //獲得Context資源
  in.close();//關閉輸入流


檔案操作案例
  參考:FileMidiPlayer
7.3.5使用檔案進行資料儲存
首先給大家介紹使用檔案如何對資料進行儲存,Activity提供了openFileOutput()方法可以用於把資料輸出到檔案中,具體的實現過程與在J2SE環境中儲存資料到檔案中是一樣的。
1
2
3
4
5
6
7
8
publicclass FileActivity extendsActivity{
   @Overridepublic void onCreate(Bundle savedInstanceState) {
       ...
        FileOutputStream outStream = this.openFileOutput(“lxt008.txt",Context.MODE_PRIVATE);
        outStream.write(“lxt008".getBytes());
        outStream.close();  
    }
}
openFileOutput()方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 會自動建立它。建立的檔案儲存在/data/data//files目錄,如:/data/data/com.lxt008/files/lxt008.txt,通過點選Eclipse選單“Window”-“Show View”-“Other”,在對話視窗中展開android資料夾,選擇下面的File Explorer檢視,然後在File Explorer檢視中展開/data/data//files目錄就可以看到該檔案。
openFileOutput()方法的第二引數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE    =  0
Context.MODE_APPEND    = 32768
Context.MODE_WORLD_READABLE =  1
Context.MODE_WORLD_WRITEABLE =  2


7.3.6 讀取檔案內容
如果要開啟存放在/data/data//files目錄應用私有的檔案,可以使用Activity提供openFileInput()方法。
1
2
FileInputStream inStream =this.getContext().openFileInput(“lxt008.txt");
Log.i("FileTest",readInStream(inStream));
readInStream()的方法請看本頁下面備註。
或者直接使用檔案的絕對路徑:
1
2
3
File file = newFile("/data/data/com.lxt008/files/lxt008.txt");
FileInputStream inStream = newFileInputStream(file);
Log.i("FileTest",readInStream(inStream));
注意:上面檔案路徑中的“com.lxt008”為應用所在包,應替換為你自己應用使用的包。
對於私有檔案只能被建立該檔案的應用訪問,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()getFilesDir()方法:
getCacheDir()方法用於獲取/data/data//cache目錄
getFilesDir()方法用於獲取/data/data//files目錄

7.4 SDCard檔案存取7.4.1 把檔案存放在SDCard
使用ActivityopenFileOutput()方法儲存檔案,檔案是存放在手機空間上,一般手機的儲存空間不是很大,存放些小檔案還行,如果要存放像視訊這樣的大檔案,是不可行的。對於像視訊這樣的大檔案,我們可以把它存放在SDCard SDCard是幹什麼的?你可以把它看作是行動硬碟或U盤。
在模擬器中使用SDCard,你需要先建立一張SDCard卡(當然不是真的SDCard,只是映象檔案)。建立SDCard可以在Eclipse建立模擬器時隨同建立,也可以使用DOS命令進行建立,如下:
Dos視窗中進入android SDK安裝路徑的tools目錄,輸入以下命令建立一張容量為2GSDCard,檔案字尾可以隨便取,建議使用.img
mksdcard 2048M D:\AndroidTool\sdcard.img
在程式中訪問SDCard,你需要申請訪問SDCard的許可權。
AndroidManifest.xml中加入訪問SDCard的許可權如下:
1
2
3
4
<!-- 在SDCard中建立與刪除檔案許可權 -->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入資料許可權 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權
1
2
3
4
5
6
7
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
         File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
         File saveFile = newFile(sdCardDir, “lxt008.txt”);
FileOutputStream outStream = newFileOutputStream(saveFile);
outStream.write(“lxt008".getBytes());
outStream.close();
}

Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
1
2
File sdCardDir = newFile("/sdcard");//獲取SDCard目錄
File saveFile = newFile(sdCardDir, “lxt008.txt");
//上面兩句程式碼可以合成一句:
1
2
3
4
File saveFile = newFile("/sdcard/lxt008.txt");
FileOutputStream outStream = newFileOutputStream(saveFile);
outStream.write(“lxt008".getBytes());
outStream.close();



三個DEMO已經打包好
包括:
FileManagerDemo
FileMidiPlayer
SharedPreferencesMidiPlayer
原始碼下載

相關文章