数据的存储方式
文件存储:使用 openFileInput()和 openFileOutput() 方法来读取文件
SharedPreferences:将数据以xml 格式存储到设备中,通常用来存储程序的配置信息
SQLite数据库:SQLite是 Android自带的一个轻量级数据库
ContentProvider:Android四大组件之一,主要作用于应用程序之间的数据交换
网络存储:通过网络提供的存储空间来存储/获取数据
文件存储: 有两种存储方式:一种是内部存储,一种是外部存储,内部存储时将数据以文件的形势存储到应用中 位置时 data/data/ < packagename>/目录下,然后这个文件会被应用程序私有化,如果别的应用要操作的话会需要权限,当卸载程序的时候,内部文件就会被删除, 内部存储使用的时 Context 提供的openFileOutput() 和 openFileInput() ,这两个方法返回 FileOutputStream对象和 FileInputStream 对象
FileOutputStream fos = openFileOutput(String name,int mode); //写入文件
FileInputStream fis = openFileInput(String name);//
mode总共有四种模式
MODE_PRIVATE 只能被当前程序读写
MODE_APPEN 内容可以追加
MODE_WORLD_READABLE 可以被其他程序读
MODE_WORLD_WRITEABLE 可以被其他程序写
写一个文件的工具类
public static boolean write(Context context, String account, String passwd){
//写入文件
try {
FileOutputStream fos = context.openFileOutput(FILE_NAME,Context.MODE_PRIVATE);
fos.write((account+","+passwd).getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
//读取文件
public static Map<String,String> getAccount(Context context){
Map<String,String> content = new HashMap<>();
try {
FileInputStream fis = context.openFileInput(FILE_NAME);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
String[] infos = new String(buffer).split(",");
if(infos.length > 0){
content.put("account",infos[0]);
content.put("passwd",infos[1]);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
删除内部文件
public static void clear(Context context){
File file = new File(context.getFilesDir(),FILE_NAME);
if(file.exists()){
file.delete();
}
}
外部存储:
将文件存储在外部设备,如SD卡或者 内置存储卡中,通常位于
/mnt/sdcard目录下 外部文件可以被其他程序所共享
添加权限
然后在类里面实现ActivityCompat.OnRequestPermissionsResultCallback的接口
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"权限申请被拒绝",Toast.LENGTH_SHORT).show();
return;
}
switch (requestCode){
case 1:
boolean isSuccess = FileUtil.savePublic(this,
userName.getText().toString().trim(),
passwd.getText().toString().trim());
if(isSuccess){
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this,"保存失败",Toast.LENGTH_SHORT).show();
}
break;
case 2:
Map<String,String> data = FileUtil.getAccount(this);
if(data.size() > 0){
userName.setText(data.get("account"));
passwd.setText(data.get("passwd"));
}
break;
}
}
public static Boolean savePublic(Context context,String account,String passwd){
//检查SD卡的权限
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions((Activity) context,
new String []{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
return false;
}
}
// 权限被允许处理
String state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
File SDPath = Environment.getExternalStorageDirectory();
File file = new File(SDPath,FILE_NAME);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((account+","+passwd).getBytes());
fos.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
return false;
}
读取外部文件中的数据
public static Map<String,String> getPublic(Context context){
Map<String,String> content = new HashMap<>();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},2);
return content;
}
}
String state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
File SDPath = Environment.getExternalStorageDirectory(); //获取SD卡路径
File file = new File(SDPath,FILE_NAME); //创建文件对象
try{
FileInputStream fis = new FileInputStream(file); //创建文件输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(fis));//创建输入缓冲流的对象
String data = br.readLine();//读取数据
String[] infos = data.split(",");
if(infos.length > 0){
content.put("account",infos[0]);
content.put("password",infos[1]);
}
br.close();//关闭字符输入缓冲流
fis.close();//关闭输入流
}catch(Exception e){
e.printStackTrace();
}
}
return content;
}
关闭外部文件
public static void clearPublic(){
File SDPath = Environment.getExternalStorageDirectory();
File file = new File(SDPath,FILE_NAME);
if(file.exists()){
file.delete();
}
}
使用SharedPreferences 以xml形势存进去
先在里面添加 权限
public static boolean saveAccount(Context context, String account, String passwd){
context.getSharedPreferences("data",Context.MODE_PRIVATE).edit().putString("account",account)
.putString("passwd",passwd).apply();
return true;
}
public static Map<String,String> getAll(Context context){
return (Map<String, String>) context.getSharedPreferences("data",Context.MODE_PRIVATE).getAll();
}
public static void clear(Context context){
context.getSharedPreferences("data", Context.MODE_PRIVATE).edit().clear().apply();
}