Android4開發入門經典 之 第七部分(2):資料儲存【私塾線上原創】
資料儲存基本知識
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檔案的操作許可權
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android4開發入門經典 之 第七部分(1):資料儲存【私塾線上原創】Android
- Android4開發入門經典 之 第三部分:Activity【私塾線上原創】Android
- Android4開發入門經典 之 第五部分:Service【私塾線上原創】Android
- Android4開發入門經典 之 第八部分:SQLite【私塾線上原創】AndroidSQLite
- Android4開發入門經典 之 第十二部分:最佳實踐【私塾線上原創】Android
- Android4開發入門經典 之 第六部分:Broadcast【私塾線上原創】AndroidAST
- Android4開發入門經典 之 第十部分:多媒體【私塾線上原創】Android
- Android4開發入門經典 之 第四部分:使用者介面【私塾線上原創】Android
- Android4開發入門經典 之 第九部分:Content Provider【私塾線上原創】AndroidIDE
- Android4開發入門經典 之 第十一部分:網路程式設計【私塾線上原創】Android程式設計
- Android4開發入門經典 之 第二部分:Android應用的核心基礎【私塾線上原創】Android
- Android4開發入門經典 之 第四部分:使用者介面Android
- 《Flutter 入門經典》之“Flutter 入門 ”Flutter
- 安卓開發之資料儲存方式安卓
- 嵌入式開發 ARM入門經典
- 分散式文件儲存資料庫之MongoDB基礎入門分散式資料庫MongoDB
- JFreeChart介紹及經典入門資料
- Room-資料持久化儲存(入門)OOM持久化
- 入門Kubernetes-資料儲存
- 14天學會安卓開發(第七天)資料儲存之SharedPreferences與檔案安卓
- Webpack經典入門Web
- JFreeChart介紹及經典入門資料(轉)
- 第七篇:經典案例:資料去重
- [轉]BI入門經典
- Kafka入門經典教程Kafka
- BI入門經典 (轉)
- 聊聊經典機器學習入門機器學習
- 安卓入門---安卓開發實戰經典1-3章安卓
- 資料倉儲入門之基本概念
- Flutter入門進階之旅(十二)Flutter 資料儲存Flutter
- 學習筆記|AS入門(七) 資料儲存篇筆記
- iOS開發資料儲存篇—iOS中的幾種資料儲存方式iOS
- Hive之 資料儲存Hive
- MySQL入門系列:儲存程式(三)之儲存過程簡介MySql儲存過程
- MySQL入門系列:儲存程式(二)之儲存函式簡介MySql儲存函式
- 資料庫開發經典五例總結資料庫
- Flutter持久化儲存之資料庫儲存Flutter持久化資料庫
- 大資料經典學習路線大資料