Android4開發入門經典 之 第七部分(2):資料儲存【私塾線上原創】

xinqing010發表於2012-03-01

資料儲存基本知識

Android系統提供了多種資料儲存的方式,如下:

1:Shared Preferences:用來儲存私有的、原始型別的、簡單的資料,通常是Key-value對
2:Internal Storage:在裝置內部儲存器中儲存資料
3:External Storage:在裝置的擴充套件儲存上儲存資料,通常是SD卡
4:SQLite Databases:SQLite資料庫
5:Network Connection:儲存資料到網路伺服器上

使用Shared Preferences

Shared Preferences是用來儲存一些應用私有的、原始型別的、簡單的資料的一個框架,儲存的資料通常是Key-value對

要獲得SharedPreferences物件,通常有兩種方法:

1:getSharedPreferences():如果你想要使用多個preferences檔案的話,可以通過傳入一個識別的名稱就可以獲取到相應的SharedPreferences物件
2:getPreferences():如果一個preferences檔案僅僅在當前的Activity中使用的話,你可以使用這個方法,無需要提供識別的名稱。
使用SharedPreferences物件來獲取資料非常簡單,直接使用相應的getter方法即可

使用SharedPreferences物件來儲存資料,大致有如下幾步

1:呼叫edit()方法來得到SharedPreferences.Editor
2:呼叫相應的put方法值新增進去
3:呼叫commit來提交儲存這些資料

向SharedPreferences物件寫入資料


java程式碼:
SharedPreferences sp =getSharedPreferences("SP",Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("param1", "sp1");
editor.putInt("param2", 222);
editor.commit();
注意:所有的寫入操作應該在一個Editor裡面,也就是不要呼叫多次sp.edit()方法,每呼叫一次就會建立一個Editor

在獲得SharedPreferences物件的時候,需要指定檔案建立的模式:

1:MODE_PRIVATE:預設模式,檔案只可以被呼叫該方法的應用程式訪問
2:MODE_WORLD_READABLE:賦予所有的應用程式都可以讀取該檔案
3:MODE_WORLD_WRITEABLE:賦予所有的應用程式都可以寫該檔案
4:MODE_MULTI_PROCESS:SharedPreference的裝載標記,設定它,檔案將會在SharedPreference例項被裝載到程式的時候檢查是否被修改,主要用在一個應用有多個程式的情況。

從SharedPreferences物件讀取資料


java程式碼:
SharedPreferences sp = T2.this.getSharedPreferences("SP",Activity.MODE_PRIVATE);
String p1 = sp.getString("param1","");
int p2 = sp.getInt("param2",0);
SharedPreferences的資料以xml儲存在data/data/包名/shared_prefs下面

Internal Storage

當應用程式被安裝到系統中後,其所在的包會有一個資料夾用於存放自己的資料,只有這個應用程式才有對這個資料夾的寫入許可權,這個私有的資料夾位於Android系統的/data/data/目錄下,其他的應用程式都無法向這個資料夾中寫入資料。
要讀取應用自己的私有檔案,就不能直接使用Java I/O的API了,需要使用Activity提供的方法:openFileInput或openFileOutput。

在使用openFileOutput方法的時候,需要指定開啟的模式:

1:MODE_PRIVATE:預設模式,檔案只可以被呼叫該方法的應用程式訪問
2:MODE_APPEND:如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。
3:MODE_WORLD_READABLE:賦予所有的應用程式對該檔案讀的許可權。
4:MODE_WORLD_WRITEABLE:賦予所有的應用程式對該檔案寫的許可權。

嚮應用對應的Internal Storage裡面寫入資料,這裡以寫物件來示例,如下:


java程式碼:
FileOutputStream fout = null;
ObjectOutputStream s = null;
try{
fout = HelloWorldActivity.this.openFileOutput("MyData.txt",Activity.MODE_PRIVATE);
s = new ObjectOutputStream(fout);
os.writeObject(list);
}catch(Exception err){err.printStackTrace();}
finally{
try {fout.close();}catch(IOException e1){e1.printStackTrace();}
try {os.close();} catch(IOException e){e.printStackTrace();}
}
不支援BufferedOutputStream

讀取應用對應的Internal Storage裡面的資料,這裡以讀取物件來示例,如下:


java程式碼:
FileInputStream fin = null;
ObjectInputStream s = null;
try{
fin = HelloWorldActivity.this.openFileInput("MyData.txt");
s = new ObjectInputStream(fin);
Toast.makeText(HelloWorldActivity.this, "read file="+os.readObject(), Toast.LENGTH_LONG).show();
}catch(Exception err){
err.printStackTrace();
}finally{
try{fin.close();}catch(IOException e1){e1.printStackTrace();}
try{os.close();}catch(IOException e){e.printStackTrace();}
}
同樣不支援BufferedInputStream

Internal Storage-儲存Cache檔案

如果你希望儲存一些Cache資料,你可以使用getCacheDir() 來開啟檔案,將會把資料儲存到一個臨時的Cache檔案裡面。
當裝置的內部儲存空間低的時候,Android系統可能會清除這些Cache檔案,以回收儲存空間,這也意味著,你不能在Cache檔案裡面儲存需要持久化的資料。

Internal Storage-其它常用方法

在Context中其他常用的方法:

1:getFilesDir()
得到內部儲存的檔案系統的絕對路徑
2:getDir()
在內部儲存中建立目錄,如果存在的話就開啟這個目錄
3:deleteFile()
刪除檔案
4:fileList()
返回當前應用儲存的檔案列表

External Storage(操作SD卡)

Android的I/O基本上和Java的I/O是一樣的,只有一點點不同的地方,比如:

1:需要加入sdcard的操作許可權
2:需要判斷sd卡是否存在,存在才能操作
3:放在sdcard的檔案是公共的,而放到自己應用目錄裡面的檔案才是私有的

常用的功能

1:在AndroidManifest.xml新增sdcard讀寫操作許可權
2:在AndroidManifest.xml新增能建立和刪除sdcard檔案的操作許可權
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
3:判斷SD卡是否插入
Environment.getExternalStorageState().equals(android.os.Enviroment.MEDIA_MOUNTED)
4:獲得SD卡根目錄
Android7及以下版本,使用:Environment.getExternalStorageDirectory()可以獲得如下路徑“/Android/data//files/”
Android8及以上版本,建議使用:Context的getExternalFilesDir(type)方法,type表示你想要訪問什麼樣的子目錄,比如Environment.DIRECTORY_MUSIC,如果訪問根目錄,就傳入null。

從SD卡上讀檔案,基本就是Java裡面I/O的操作,這裡以讀物件為例:


java程式碼:
public Object readFile(String filePathName) {
Object ret = null;
FileInputStream fins = null;
ObjectInputStream s = null;
try {
File file = new File(Environment.getExternalStorageDirectory() + filePathName);
fins = new FileInputStream(file);
s = new ObjectInputStream(fins);
ret = os.readObject();
} catch(Exception err){err.printStackTrace();}finally{
try {fins.close();}catch(IOException e){e.printStackTrace();}
try {os.close();}catch(IOException e){e.printStackTrace();}
}
return ret;
}
比較遺憾的是,目前加上BufferedInputStream就出錯

向SD卡上寫檔案,基本就是Java裡面I/O的操作,這裡以寫物件為例:


java程式碼:
public void writefile(String filePathName,Object obj){
FileOutputStream fouts = null;
ObjectOutputStream s = null;
try {
File file = new File(Environment.getExternalStorageDirectory() +filePathName);
if(file.getParentFile().isDirectory() && !file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
if(!file.exists()){ file.createNewFile(); }
fouts = new FileOutputStream(file);
s = new ObjectOutputStream(fouts);
os.writeObject(obj);
} catch (Exception err) {err.printStackTrace();
}finally{
try {fouts.close();}catch(IOException e){e.printStackTrace();}
try {os.close();}catch(IOException e){e.printStackTrace();}
}
}
如果要儲存成Cache檔案,可以使用Context的getExternalCacheDir方法
 

視訊配套PPT,視訊地址【 Android4開發入門經典獨家視訊課程

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26715458/viewspace-717431/,如需轉載,請註明出處,否則將追究法律責任。

相關文章