安卓開發之資料儲存方式
一、Android資料儲存方式
內部儲存:一般來說,內部儲存即data資料夾下的儲存,包括:
- SharedPrefrence儲存
- 手機內部檔案儲存
- Sqlite資料庫儲存
外部儲存:外部儲存一般就是我們上面的storage資料夾/mnt資料夾
- 手機外部檔案儲存
遠端伺服器儲存
二、SharedPrefrence儲存
- SP儲存專門用來儲存一些單一的小資料,例如一些基本資料型別資料
- 儲存資料型別:boolean,float,int,long,String
資料儲存的路徑:/data/data/包名/shared_prefs/xxx.xml
xml檔案內容示例:
可以設定資料只能是當前應用讀取,別的應用不可以讀取
- 應用解除安裝 時會刪除儲存資料的xml檔案
一、相關API
獲取SharedPrefrence例項
SharedPreferences本身是一個介面,程式無法直接建立SharedPreferences例項,只能通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences例項,該方法中name表示要操作的xml檔名,第二個引數如下:
Context.MODE_PRIVATE: 指定該SharedPreferences資料只能被本應用程式讀、寫。 Context.MODE_WORLD_READABLE: 指定該SharedPreferences資料能被其他應用程式讀,但不能寫。 Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences資料能被其他應用程式讀,寫
從SP檔案中得到相關資料:
SharedPreferences .getXxx(String key, Xxx defaultname);
更新SP檔案內容的介面:Editor
獲取SharedPreferences的Editor物件: SharedPreferences editor(); SharedPreferences.Editor clear():清空SharedPreferences裡所有資料 SharedPreferences.Editor putXxx(String key , xxx value): 向SP存入指定key對應的資料,其中xxx 可以是boolean,float,int等各種基本型別據 SharedPreferences.Editor remove(): 刪除SharedPreferences中指定key對應的資料項 //上述方法可以進行方法鏈呼叫(返回的是Editor物件本身) boolean commit(): 當Editor編輯完成後,使用該方法提交修改才可以真正地把修改後的內容儲存到檔案中。
讀寫其他應用程式的SharedPreferences(跨應用讀取資料)
// 1. 建立其他應用程式對應的Context: Context otherContext = this.createPackageContext("其他應用程式的包名", Context.CONTEXT_IGNORE_SECURITY); // 2.獲取對應的SharedPreferences物件,注意相應的mode SharedPreferences sharedPreferences = otherContext.getSharedPreferences("相關的xml檔名", Context.MODE_WORLD_READABLE); //3.獲取SP物件成功之後,可實現對應的讀/寫操作。 ...
二、手機內部檔案儲存
- 應用執行時需要的一些較大的資料/圖片可以用檔案儲存到手機內部
- 檔案型別:任意
- 檔案儲存的位置:/data/data/包名/files/
- 可以設定資料只能當前應用讀取,別的應用不可以
- 應用解除安裝時,檔案會被刪除
一、相關API
讀取/data/data/包名/files/中的檔案:
FileInputStream fis = this.openFileInput(“檔名”);
儲存檔案到/data/data/包名/files/中:
FileOutputStream fos = this.openFileOutput(“指定要儲存的檔名”,int mode);
得到files資料夾物件:
File filesDir = this.getFilesDir();
二、儲存檔案程式碼示例
將assets下的bg.png檔案複製儲存到手機內部
//得到assets下的bg.png檔案的InputStream
AssetManager manager = this.getAssets();
InputStream is = manager.open("bg.png");
//得到files下的bg.png檔案的輸出流
FileOutputStream fos = openFileOutput("bg.png",Context.MODE_PRIVATE);
//邊讀邊寫
byte[] buffer = new byte[1024];
int len = -1;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
is.close();
fos.close();
//儲存完成
三、讀取檔案程式碼示例
讀取files下的bg.png檔案,並載入圖片檔案。
//獲取檔案的輸入流
InputStream is = (InputStream) this.openFileInput("bg.png");
//將輸入流解析為bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
//顯示bitmap
((ImageView)findViewById(R.id.imageView)).setImageBitmap(bitmap);
is.close();
/*----第二種寫法----*/
//獲取files資料夾
File filesDir = this.getFilesDir();
//獲取檔案的絕對路徑
String filePath = filesDir.getAbsolutePath()+"/bg.png";
//解析與顯示
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
((ImageView)findViewById(R.id.imageView)).setImageBitmap(bitmap);
三、SD卡外部儲存
- 應用執行用到的資料檔案可以儲存到sd卡中
- 檔案型別:任意
資料儲存的路徑:
- 路徑1(包名路徑):/storage/sdcard/Android/data/包名/files/
- 路徑2:/storage/sdcard/xxx/(其中xxx自定義)
路徑1:其他應用可以訪問,應用解除安裝時被刪除
- 路徑2:其他應用可以訪問,應用解除安裝時不被刪除
- 必須保證sd卡掛載在手機上才能讀寫,否則不能操作。
一、相關API
Environment:操作SD卡的工具類
得到SD卡的狀態:Environment.getExternalStorageState();
SD卡可讀寫的掛載狀態值:Environment.MEDIA_MOUNTED(字串)
得到SD卡的根目錄路徑:Environment.getExternalStorageDirectory();
(SD卡根目錄:/storage/sdcard/)
得到路徑一的目錄(/storage/sdcard/Android/data/包名/files/)
- context.getExternalFilesDir(String type) (type可以為null,也可以為路徑一下的子目錄名稱) 例: context.getExternalFilesDir("music").getAbsolutePath() 為 /storage/sdcard/Android/data/包名/**files**/music (目錄不存在則自動建立)
操作SD卡(讀寫)的許可權:
- android.permission.WRITE_EXTERNAL_STORAGE - android.permission.READ_EXTERNAL_STORAGE
二、儲存檔案到路徑1示例:
//判斷SD卡狀態 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = "123.txt";
String content = "abcdefg";
File bookDir = this.getExternalFilesDir("Book");
String filePath = bookDir.getAbsolutePath()+"/"+fileName;
try {
//得到指定檔案的FileOutputStream
//(檔案建立/重寫)
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(content.getBytes("utf-8"));
fos.close();
Toast.makeText(this,"儲存成功",Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(this,"SD未掛載",Toast.LENGTH_SHORT).show();
}
//注意加許可權
三、從路徑1讀取檔案示例:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = "123.txt";
File bookDir = this.getExternalFilesDir("Book");
String filePath = bookDir.getAbsolutePath()+"/"+fileName;
try {
//獲取檔案輸入流
FileInputStream fis = new FileInputStream(filePath);
// 建立一個Byte 陣列輸出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len=fis.read(buffer))!=-1){
baos.write(buffer,0,len);
}
fis.close();
baos.close();
String content = baos.toString();
Toast.makeText(this,content,Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
四、儲存檔案到路徑2示例:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = "123.txt";
String content = "111在哪裡11在這裡22";
//: /storage/sdcard
File sdDir = Environment.getExternalStorageDirectory();
//: /storage/sdcard/Book
File bookDir = new File(sdDir.getAbsolutePath()+"/Book");
if(!bookDir.exists()) bookDir.mkdir();
//: /storage/sdcard/Book/fileName
String filePath = bookDir.getAbsolutePath()+"/"+fileName;
try {
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(content.getBytes("utf-8"));
fos.close();
Toast.makeText(this,"儲存成功",Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(this,"SD未掛載",Toast.LENGTH_SHORT).show();
}
五、從路徑2中讀取檔案示例:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String fileName = "123.txt";
//: /storage/sdcard/Book/fileName
String filePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Book/"+fileName;
try {
FileInputStream fis = new FileInputStream(filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len=fis.read(buffer))!=-1){
baos.write(buffer,0,len);
}
fis.close();
baos.close();
String content = baos.toString();
Toast.makeText(this,content,Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
相關文章
- iOS開發資料儲存篇—iOS中的幾種資料儲存方式iOS
- HDU-安卓程式開發之簡單儲存/內部儲存/外部儲存 & 捉蟲安卓
- java 資料儲存方式Java
- 14天學會安卓開發(第七天)資料儲存之SharedPreferences與檔案安卓
- 資料儲存的三種方式
- Hive之 資料儲存Hive
- 資料儲存的方式(只說三種方式)
- Flutter持久化儲存之資料庫儲存Flutter持久化資料庫
- iOS儲存資料的4種方式iOS
- 如何在安卓應用程式中儲存資料安卓
- 資料儲存(1):從資料儲存看人類文明-資料儲存器發展歷程
- 儲存資料之SharedPreference
- IOS資料儲存之NSUserDefaultsiOS
- k8s之資料儲存-配置儲存K8S
- IOS資料儲存之檔案沙盒儲存iOS
- IOS資料儲存之Sqlite資料庫iOSSQLite資料庫
- IOS資料儲存之FMDB資料庫iOS資料庫
- 資料庫開發---常用物件-儲存過程資料庫物件儲存過程
- IOS資料儲存常用的5種方式iOS
- 單細胞資料 儲存方式彙總
- Android中的資料儲存之檔案儲存Android
- k8s之資料儲存-高階儲存K8S
- Android資料儲存之SharedPreferences及如何安全儲存Android
- 資料結構 (計算機儲存、組織資料方式)資料結構計算機
- 樹狀資料結構儲存方式—— CUD 篇資料結構
- Web3證明資料的儲存方式Web
- 資料儲存--檔案儲存
- 《資料儲存》之《分庫,分表》
- 海量資料儲存之動態SchemaOU
- MaxCompute實戰之資料儲存
- greenDAO資料庫之修改儲存地址資料庫
- Android資料儲存之SQLCipher資料庫加密AndroidSQL資料庫加密
- 資料儲存
- 樹狀資料結構儲存方式——查詢篇資料結構
- Python資料儲存方式有幾種?如何使用?Python
- Spark(16) -- 資料讀取與儲存的主要方式Spark
- iOS應用資料儲存的幾種常用方式iOS
- iOS開發系列--C語言之儲存方式和作用域iOSC語言