数据的访问与存储
Android有五种数据存储方式:文件存储、SharedPreferences、SQLite数据库、ContentProvider、网络存储。
文件存储: 通过I/O流读写文件,跟Java是一样的,一般用来存储一些较大的数据,如文本、图片、音频、视频等。
SharePreferences: Android中用来存储一些配置信息的方式,XML格式。
SQLite数据库: Android中一种轻量级的数据库,支持SQL语法。
ContentProvider: Android四大组件之一,可实现应用程序之间的数据交换,实现数据共享。
网络存储: 通过将数据存储到服务器,从而实现数据的存储。
文件存储
一种常见的存储方式,类似于Java的I/O流的读取/写入,可存储文本、图片、音频、视频等等。
1.内部存储
内部存储是指将应用程序中的数据以文件的方式存储到设备内部,为所创建的应用程序私有,如果有其他应用程序想要访问该数据,需要访问权限,该数据随着应用程序的消亡而消亡。
//输出流
FileOutputStream fos = openFileOutput(String name, int mode);//文件名+操作
String content = "要输出的数据";
byte[] buffer = content.getBytes();//建立缓冲
fos.write(buffer);//写入数据
fos.close();//关闭输出流
//输入流
FileInputStream fis = openFileInput(String name);//文件名
byte[] buffer = new byte[fis.available()];//建立缓冲
fis.read(buffer);//读取缓冲区
fis.close();//关闭输入流
openFileOutput()用来打开应用程序对应输出流,将数据存储到指定文件中;openFileInput()用于打开应用程序对应的输入流,读取指定文件中的数据。
mode的四种取值:
MODE_PRIVATE:只能当前程序读写
MODE_APPEND:可追加内容
MODE_WORLD_READABLE:可被其他应用程序读取
MODE_WORLD_WRITEABLE:可被其他应用程序写入
(注意:文件输入输出流要添加try/catch语句)
File file1 = getFilesDir();//获得当前应用在内部存储上的根目录
File file2 = new File(file1, "文件名");//在指定目录创建文件夹
File file3 = getCacheDir();//获得缓存目录,该目录在系统空间不足时会被清理
deleteFile("文件名");//删除文件
2.外部存储
外部存储是指将文件存储到外部设备上,SD卡、内嵌存储卡等等,是永久性存储,可被其他应用所共享,但这种存储方式不安全,因为可被轻易地浏览、修改和删除。
String state = Environment.getExternalStorageState();//获取外部设备
if(state.equals(Environment.MEDIA_MOUNTED)){//判断是否存在外部设备
File SDPath = Environment.getExternalStorageDirectory();//获取SD卡目录
}
Android系统为例保证应用程序的安全性做了相关规定,如果程序需要访问系统的关键信息,必须在清单文件中申明权限才可以,否则程序会崩溃。操作SD卡的数据是系统中比较重要的,所以需要在清单文件的<manifest>中t添加SD卡读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在Android6.0以后出于安全考虑,还要在代码中动态申请权限:
private static final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RequestPermission();//申请权限
}
void RequestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if (!(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
requestPermissions(permissions, REQUEST_CODE);
}
}
//权限回调
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
int grantResult = grantResults[0];
boolean granted = grantResult == PackageManager.PERMISSION_GRANTED;
}
}