Android 数据存储

概述

image

  • 文件存储 特点:openFileInput()和openFileOutput()读取设备上的文件。

  • SharedPreferences 特点:以XML格式将数据存储到设备。

  • SQLite数据库 特点:运算速度快,占用资源少,还支持基本SQL语法。

  • ContentProvider 特点:应用程序之间的数据交换,可以将自己的数据共享给其他应用程序使用。

  • 网络存储 特点:通过网络提供的存储空间来存储/获取数据信息。

文件存储

存储位置

现在认为 内部存储是指应用自己能够操控的存储空间(应用自己的空间)。除此之外是外部存储。
image

存入内部存储

写入内部存储,不需要申请权限,直接读写即可。

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及以上

流程是:

  1. 先判断有没有权限
  2. 没有权限,申请权限
  3. 判断用户否是同意权限
  4. 如果同意,正常进行程序; 如果不同意,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();
posted @ 2023-05-05 17:26  kingwzun  阅读(40)  评论(0编辑  收藏  举报