安卓笔记1之数据存储的方式

01-常见的保存数据方式
数据保存方式
  • /data/包名/……..
    特征:
    • 私有的
    • 文件夹下可以存储私有的数据,给文件夹比较安全,只有特定app可以访问
    • 主要用于保存一些比较保密的数据
  • Sdcard
    • 不安全
    • 可以保存较大的数据
    • Sccard是公共的存储空间,如果要使用Android
  • SharedPreferences 共享的应用信息
    • 存储空间/data/data/包名/shard_pres/config.xml,只有自己的应用能用
    • 使用方法:
      • getSharedPreferences(name,mode);
        • 参数1:
        • 参数2:只会传一个值,MODE_PRIVATE代表一个私有文件,只有发当前APP使用
  • Sqlite数据库
  • Contentprovider内容提供者
  • 服务器
数据保存格式
  • xml
  • json
    • JavaScript Object Notation
    • 是存储和交换文本信息的语法
    • json中可保存的数据类型
    • Json包括两种格式:json对象、json数组
      • 语法规则
        • 数据在名称/和键值对中
        • 数据用逗号分隔
        • {}花括号存储对象
        • []中括号存储数组
数据存储的步骤:
1. 初始化UI
2. 获取用户名和密码,获取CheckBox是否被选中了
3. 如果被选中了  
     3.1 将用户名和密码保存到/data/data/包名/files/user.txt
 4. 如果没有被选中  
4.1 删除user.txt文件
5. 数据的回显  

数据存储之data存储:
一、写UI界面
 二、在MainActivity的onCreate方法里写业务逻辑   

1、获取控件的对象
    //方法:findViewById

2、设置Button点击事件
    //四种方法选一即可
    1.获取用户名和密码
        //方法:EditText对象.getText().toString()

    2.为了防止用户啥都没输就点按钮,要先做非空校验
        如果为空,吐司:用户名或者密码都不能为空!   return 返回,等待下一次点击
        如果不为空,继续下面的代码

    3.获取CheckBox是否被选中
        //方法:CheckBox对象.isChecked()
        A:如果选中,用io流将用户名和密码保存到/data/data/包名/files/user.txt
            //方法:openFileOutput("user.txt",MODE_PRIVATE)

        B:如果没有选中,删除user.txt
            //方法:deleteFile("user.txt")

3、在点击事件前设置数据回显
    1.用io流读取文件
        //方法:openFileInput("user.txt")

    2.将读取到的内容设置在EditText上
        //方法:EditText对象.setText(String)

三、在虚拟机上部署测试
案例:《保存用户名密码到sd卡》
    一、写UI界面
    二、在MainActivity的onCreate方法里写业务逻辑    

        1、获取控件的对象
            //方法:findViewById

        2、设置Button点击事件
            //四种方法选一即可
            1.获取用户名和密码
                //方法:EditText对象.getText().toString()
            2.为了防止用户啥都没输就点按钮,要先做非空校验
                如果为空,吐司:用户名或者密码都不能为空!   return 返回,等待下一次点击
                如果不为空,继续下面的代码

            3.因为不同版本API中SD卡根目录不同,所以要动态的获取SD卡根目录
                //方法:Environment.getExternalStorageDirectory();

            4.获取CheckBox是否被选中
                //方法:CheckBox对象.isChecked()
                A:如果选中,用io流将用户名和密码保存到 SD卡根目录/user.txt
                    //方法:openFileOutput("user.txt",MODE_PRIVATE)
                      方法二:
                   File file=Environment.getExternalStorageDirectory();
                FileWriter fWriter = new FileWriter(new File(file, "user.txt"));
                B:如果没有选中,删除user.txt
                    //方法:deleteFile("user.txt")
                                    方法二
                                           File file = new File(Environment.getExternalStorageDirectory(), "user.txt");
                      boolean delete = file.delete();                                    


        3、在点击事件前设置数据回显
            1.用io流读取文件
                //方法:openFileInput("user.txt");
                          方法二:
    BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(Environment.getExternalStorageDirectory(), "user.txt"))));

            2.将读取到的内容设置在EditText上
                //方法:EditText对象.setText(String)
        4、在配置文件获取SD卡的访问权限
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    三、在虚拟机上部署测试

案例:《获取SD卡空间信息的两种方法》
一、写UI界面
二、在MainActivity的onCreate方法里写业务逻辑
    1、1、获取控件的对象
//方法:findViewById

2、设置Button点击事件
//选用第三种方法,MainActivity实现OnClickListener接口
因为有两个Button,所以onClick方法中要使用switch-case语句来判断触发点击事件的是哪个按钮

1.如果是Button1,使用File类和Formatter工具类来实现需求
判断sdcard是否可用
//方法:Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

A:如果可用
    1.获取SD卡的File对象
    //方法:Environment.getExternalStorageDirectory();
    2.获取总空间,单位:byte,用long接收
    //File类的getTotalSpace()
    3.获取可用空间,单位:byte,用long接收
    //File类的getUsableSpace()
    4.将获取到的空间数值格式化
    //方法:Formatter.formatFileSize(Context 上下文,long 文件大小)
    5.将空间信息显示在TextView上
    //方法:TextView对象.setText(String)

B:如果不可用,在TextView上显示sdcard不可用!
    //方法:TextView对象.setText(String)

2.如果是Button2,使用StatFs 文件系统状态工具类来实现需求
判断sdcard是否可用
//方法:Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

A:如果可用
    1.获取SD卡绝对路径
    //方法:Environment.getExternalStorageDirectory().getAbsolutePath();
    2.创建StatFs对象,绑定SD卡路径
    3.获取总共多少个块
    //方法:getBlockCount()
    4.获取可用块个数
    //方法:getAvailableBlocks
    5.获取每个块的大小
    //方法:getBlockSize()
    6.计算总空间和可用空间
    //块数 * 每块大小,单位:byte
    7.将获取到的空间数值格式化
    //方法:Formatter.formatFileSize(Context 上下文,long 文件大小)
    8.将空间信息显示在TextView上
    //方法:TextView对象.setText(String)

B:如果不可用,在TextView上显示sdcard不可用!
    //方法:TextView对象.setText(String)


三、在虚拟机上部署测试

案例:《==SharedPerferences==》
1.先写UI
2.在MainActvity里面写业务逻辑
    ****初始化控件**
    获得SharedPerferences的对象
        SharedPerferences sp = getSharedPerferences;
    ****设置Button点击事件**
        获取用户名和密码
        String nameString  = nameEditText.getText().toString().trim();
        String password  = pwdEditText.getText().toString().trim();
        判断用户名和密码是否为空
            如果为空用Toast.makeText()提示用户名和密码不能为空
            return
        判断选择框是否勾选
            如果勾选就把用户和密码写到文件中
                获取编辑器
                  Editor ed = sp.edit();
                向编辑器添加数据格式以键和值的方式存储,并且键是要存在
                  ed.putString(key,value);
                提交数据
                  ed.commid();
                提示保存成功
                 Toast.makeText();
            如果没有勾选就把数据删除,(删除的是数据,不是文件)
                获取编辑器
                  Editor ed = sp.edit();
                清空数据
                    ed.clear();
                    (如果单条删除,就通过键删除remove())
                提示删除成功Toast
    ****数据回显**
        获取配置文件里的信息(也就是你写进去的数据(用户名和密码))
            //通过sp.getXxx()方法获取
             String name = sp.getString(key,默认值(一般是空字符串""));
            给用户名和密码设置获取的数据,让数据回显
                EditText.setText(name);
            设置选择框的勾选状态
                如果用户名和密码不为空就勾选
                //通过TextUtils.isEmpty(str);判断是否为空
                    checkBox.setCheckBox(true);
三、在虚拟机上部署测试

案例:《JSON解析》

解析JSON对象
1. 获取一个json数据
2. 创建一个JSONObject对象
jsonObject jsonobject =new jsonObject(json 字符串);
3. 通过getXXX()方法获取json里面的内容
4. 把内容放到一个对象类中,打印出来

解析json数组


  1. 获取一个json数组数据
  2. 创建一个JSONArray数组对象

jsonArray jsonArray =new jsonArray(json 字符串);

  • 通过for循环来获取json数组的内容
  • 对象名.length():获取json数组长度
  • 通过对象名.getJsonObject():获取数组里里面的对象
  • 通过getXXX()方法获取json里面的内容
  • 把内容放到一个对象类中,打印出来
  • 把这个对象放到一个集合中,打印出来

新的API
1.Formatter:格式化字节大小
2.Environment动态获取SD卡的根目录  
        外部存储目录:Environment.getExternalStorageDirectory();
            获取总空间:
                .getTotaSpace()
            剩余空间:
                .getUsableSpace()

    Environment.getExternalStorageState().equals(Environment.)//获取状态,判断是否可用
        Environment.MEDIA_BAD_REMOVAL:移除的
        Environment.MEDIA_REMOVED:移除
        Environment.MEDIA_UNKNOWN:损坏的
        Environment.MEDIA_MOUNTED:正常挂载

新的工具类:
统计文件总空间:
    StatFs 
        方法:
            .getTotalBytes();获取总共空间
            .getAvailableBytes():获取可用空间
        过期的方法:
            总共多少块
                GetBlockCount()
            每个快的大小
                getBlockSize()
            可用块数
                getAvailableBlocks()
判断文件是否为空
    TextUtils
        TextUtils.isEmpty(“字符串”);//判断是否为空
解析JSON对象
    构造:
        JSONObject(JSON对象);
    方法:
        getString(字符串)

解析JSON数组
    数组{ }
        JSONArray(JSON数组对象)

getSharedPerferences的操作模式
- MODE_APPEND,
- MODE_ENABLE_WRITE_AHEAD_LOGGING,
- MODE_MULTI_PROCESS,
- MODE_PRIVATE,
- MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE


遇到的问题:
1. 保存数据到data中,写入数据时,忘记使用openOutputStream,读取输入的字符串,通过.getByte() 方法,把字符串准换成字节数据,删除时,调用deleteFile()方法
2. 数据回显,要用高效字符流获取,再调用转换流准换成字节流,调用openInputStream()方法
3. 回显数据,文件名写错,记住应用的常量尽量定义一个全局静态的常量

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值