Android中的数据存储——本地存储

Android的数据存储方式

  • SharedPreferences数据存储
  • 文件存储(内部储存,外部存储)
  • SQLite数据库存储
  • ContentProvider储存数据
  • 网络存储
1、 SharedPreferences是Android的一个轻量级存储工具,用于存放类似登录信息的配置信息,采用的存储结构是Key-Value的键值对方式,本质上是一个XML文件,文件位于程序的私有目录中 文件命名为“shared_prefs”

1.1 存储信息到SharedPreferences中

 public void onClick(View view) {
                //1.获取两个输入框的内容
                String account = accEdt.getText().toString();
                String pwd = pwdEdt.getText().toString();
                //2.验证(admin  123)
                    if(account.equals("admin") && pwd.equals("123")){
                        //存储信息到SharePreference
                        //获取SharePreference对象(参数1:文件名  参数2:SharedPreferences的操作模式)
                        SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
                        //获取Editor对象
                        SharedPreferences.Editor edt = share.edit();
                        //存储信息
                        edt.putString("account",account);
                        edt.putString("pwd",pwd);
                        //指定提交操作
                        edt.commit();

                        Toast.makeText(ShareActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
                    }else {
                        //2.2验证失败,提示用户
                        Toast.makeText(ShareActivity.this,"账号或密码错误",Toast.LENGTH_SHORT).show();
                    }
            }
        });

1.2 SharedPreferences的操作模式

  • MODE_APPEND : 追加模式
  • MODE_PRIVATE :私有方式存储,其它应用无法访问 (一般用的都是这个模式)
  • MODE_WORLD_READABLE:可被其它应用读取
  • MODE_WORLD_WRITEABLE: 可被其它应用写入

1.3 从SharedPreferences中读取信息

//SharePreference的读取
        //获取SharePreference对象(参数1:文件名  参数2:模式)
        SharedPreferences share = getSharedPreferences("myshare",MODE_PRIVATE);
        //根据key获取内容(参数1:key   参数2:当对应key不存在时,返回参数2的内容作为默认值)
        String accStr = share.getString("account","");
        String pwdStr = share.getString("pwd","");

2、文件存储–>外部存储(ExternalStorage): 外部存储简单的说就像之前的SD卡,现在的手机基本上都把SD卡固化到手机内部了,在使用外部存储时需要在AndroidManifest.xml中申请外部存储访问权限,在Android 6.0之后得动态申请权限
2.1外部存储中的私有空间:在外部存储中也分为公有空间和私有空间,对于公有空间比如(DCIM、Download、Movies等)是所有应用都能访问的空间,使用时必须得申请权限, 而私有空间是只有应用自己才可访问的专享空间(Android/data/应用包名),使用时不需要申请权限,当应用被卸载时,该空间也会被清理掉,不会让手机产生过多的数据垃圾
获取外部存储的私有目录

  • Context.getExternalFilesDir(); (该文件用于长时间存放的数据)
    获取到Android/data/[包名]/files/目录

  • Context.getExternalCacheDir(); (该文件用于存放临时用的缓存数据)
    获取到Android/data/[包名]/files/目录

2.2 获取取手机上外部存储的信息通过Environment类实现,该类是App获取各种目录信息的工具,主要有一下几种

  • getRootDirectory: 获得系统根目录的路径
  • getDataDirectory:获得系统数据目录的路径
  • getDownloadCacheDirectory : 获得下载缓存目录的路径
  • getExternalStorageDirectory:获得外部存储(sd卡)的路径
  • getExternalStorageState : 获得SD卡的状态

2.3 使用外部存储的动态申请权限

  • ContextCompat.checkSelfPermission(context,permission); (返回一个整型的数值)
  • ActivityCompat.requestPermissions(activity,permission,code);
   int permission= ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
       if(permission!= PackageManager.PERMISSION_GRANTED){
           /**
            * 动态申请权限,第二个参数传的时一个字符串数组,里面时需要申请的权限
            * code : 该方法会调用一个onRequestPermissionsResult(requestCode, permissions, grantResults)方法,可以通过传入的请求码识别
            */
           ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},1);
       }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==1){
            Log.d(TAG, "onRequestPermissionsResult: 我是请求码等于一,");
        }
    }

2.4对外部存储的读写操作

  //外部存储的读取和写入操作
    public void operate(View v){
        //自定义一个文件路径
             String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/hztk/huangdada.txt";
             switch (v.getId()){
                 //外部存储的写入操作
            case R.id.save_btn:
                String strings=infoEdt.getText().toString();
                //创建文件路径为 path 的文件
                File newfile= new File(path);
                    try {
                        //判断文件是否存在,不存在就创建,这里会抛出一个异常
                     if(!newfile.exists()){
                         newfile.createNewFile();
                     }
                        //创建一个文件输出流指向path文件路径,并允许往文件中追加数据
                        FileOutputStream outputStream=new FileOutputStream(path,true);
                        outputStream.write(strings.getBytes());
                        //关闭输出流
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.d(TAG, "operate: 文件创建失败" + e.getMessage());
                    }
                    break;
                    //外部存储的读取操作
                 case R.id.read_btn :
                     try {
                         //创建文件输入流
                         FileInputStream inputStream=new FileInputStream(path);
                         //创建一个字节缓冲流数组
                         byte []bytes =new byte[1024];
                         //从文件输入流读取字节数组
                           int length= inputStream.read(bytes);
                           //把字节数组转化为字符串
                           String str=new String(bytes,0,length);
                           txt.setText(str);
                           //关闭输入流
                           inputStream.close();
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }break;
             }
             }

3、文件存储—>内部存储(InternalStorage):,内存中有两个文件夹 “App”,“data”,内部存储和外部存储中的私有空间差不多,如果手机上没有SD卡的时候,就会把相应的文件放进内部储存中,
3.1 获取内存中的目录

  • Context.getFilesDir();
  • Context.getCacheDir();

3.2 内部存储的使用
内部存储的使用方法 和外部的使用方法类似,可以参考上面的外部存储的代码,就修改一下文件路径即可

附加: 在使用外部存储的时候可以先判断一下SD卡的状态

//getExternalStorageState : 获得SD卡的状态
 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Log.d(TAG, "onCreate: 有外部存储");
        }else {
            Log.d(TAG, "onCreate: 没有外部存储");
        }

SD卡的状态取值说明

Environment类的储存状态常量名常量说明
MEDIA_UNKNOWN未知
MEDIA_REMOVED已经移除
MEDIA_UNMOUNTED未挂载
MEDIA_CHECKING正在检查
MEDIA_NOFS不支持的文件系统
MEDIA_MOUNTED已经挂载,可读写状态
MEDIA_MOUNTED_READ_ONLY已经挂载,只读状态
MEDIA_SHARED当前未挂载,但通过USB共享
MEDIA_BAD_REMOVAL未挂载就被移除
MEDIA_UNMOUNTABLE无法挂载
MEDIA_EJECTING正在弹出
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值