Android 数据存储
概述
-
文件存储 特点:openFileInput()和openFileOutput()读取设备上的文件。
-
SharedPreferences 特点:以XML格式将数据存储到设备。
-
SQLite数据库 特点:运算速度快,占用资源少,还支持基本SQL语法。
-
ContentProvider 特点:应用程序之间的数据交换,可以将自己的数据共享给其他应用程序使用。
-
网络存储 特点:通过网络提供的存储空间来存储/获取数据信息。
文件存储
存储位置
现在认为 内部存储是指应用自己能够操控的存储空间(应用自己的空间)。除此之外是外部存储。
存入内部存储
写入内部存储,不需要申请权限,直接读写即可。
FileOutputStream fos = openFileOutput(String name, int mode);
FileInputStream fis = openFileInput(String name);
String fileName = "data.txt"; // 文件名称
String content = "helloworld"; // 保存数据
FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
fos.write(content.getBytes());
fos.close(); //关闭输出流
mode取值:
- MODE_PRIVATE:该文件只能被当前程序读写
- MODE_APPEND:该文件的内容可以追加;
- MODE_WORLD_READABLE:该文件的内容可以被其他程序读;
- MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序写
注意:Android系统有一套自己的安全模型,默认情况下任何应用创建的文件都是私有的,其他程序无法访问。
读取内部存储中的文件的数据
String content = "";
FileInputStream fis = null;
fis = openFileInput("data.txt"); //获得文件输入流对象
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
content = new String(buffer);//转换成字符串
fis.close(); //关闭输入流
存储外部存储
读入
String state = Environment.getExternalStorageState();//获取外部设备的状态
if (state.equals(Environment.MEDIA_MOUNTED)) {//判断外部设备是否可用
File SDPath = Environment.getExternalStorageDirectory();//获取SD卡目录
File file = new File(SDPath, "data.txt");
String data = "HelloWorld";
FileOutputStream fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
}
读取外部存储中的文件数据
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
File SDPath = Environment.getExternalStorageDirectory(); //获取SD卡路径
File file = new File(SDPath, "data.txt"); //创建文件对象
FileInputStream fis = null;
BufferedReader br = null;
fis = new FileInputStream(file); //创建文件输入流对象
//创建字符输入缓冲流的对象
br = new BufferedReader(new InputStreamReader(fis));
String data = br.readLine(); //读取数据
br.close(); //关闭字符输入缓冲流
fis.close(); //关闭输入流
}
动态申请权限
Android系统规定,程序访问系统的一些关键信息时,必须申请权限,否则程序运行时会因为没有访问系统信息的权限而直接崩溃。
申请权限方式 分为静态和动态
动态申请权限,适用系统版本:Android 6.0及以上
流程是:
- 先判断有没有权限
- 没有权限,申请权限
- 判断用户否是同意权限
- 如果同意,正常进行程序; 如果不同意,xxxx
// 动态申请权限的方法
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 1);
//申请权限的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
//用户授予权限的结果,当用户授予权限时,该数组中对应的值为PackageManager.PERMISSION_GRANTED
SharedPreferences存储
将数据存入SharedPreferences中
SharedPreferences:是Android平台上一个轻量级的存储类,用于程序中一些少量数据持久化存储。
以key/value(键值对)的形式保存数据,value值只能是float、int、long、boolean、String、Set<String>
类型数据。
SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);//名字不要加.xml,系统会自动加.xml
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", "传智播客");// 存入String类型数据
editor.putInt("age", 8); // 存入int类型数据
editor.commit();
读取和删除数据
//读取SharedPreferences文件中的数据。
SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);
String data= sp.getString("name","");
//删除SharedPreferences文件中的数据。
editor.remove("name");
editor.clear();