01-常见的保存数据方式
数据保存方式
- /data/包名/……..
特征:
- 私有的
- 文件夹下可以存储私有的数据,给文件夹比较安全,只有特定app可以访问
- 主要用于保存一些比较保密的数据
- Sdcard
- 不安全
- 可以保存较大的数据
- Sccard是公共的存储空间,如果要使用Android
- SharedPreferences 共享的应用信息
- 存储空间/data/data/包名/shard_pres/config.xml,只有自己的应用能用
- 使用方法:
- getSharedPreferences(name,mode);
- 参数1:
- 参数2:只会传一个值,MODE_PRIVATE代表一个私有文件,只有发当前APP使用
- getSharedPreferences(name,mode);
- 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数组
- 获取一个json数组数据
- 创建一个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. 回显数据,文件名写错,记住应用的常量尽量定义一个全局静态的常量