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 | 正在弹出 |