1. 概述
在Android中有以下几种保存数据方式:
1). 使用sharedPreference去保存:只有应用程序自己可以访问
2). 保存在应用程序私有的文件夹下:只有应用程序自己可以访问
3). 使用File形式保存在file/cache目录下
4). 保存到公共的sd卡上:其他的应用程序也可以访问
5). 使用数据库去保存(MySQL)
其中1.2.3的共性都是保存在当前应用的目录下的私有数据
2. 方法一:File方式保存
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);try{
File f= new File("/data/data/com.example.aplex.testforgit/test.txt");
BufferedWriter writer= new BufferedWriter(newFileWriter(f)) ;
writer.write("hahahehe");
writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
3. 方法二:File方式保存(data/cache目录下)
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try{
//1. 保存在应用的cache中
{
File f = new File(getCacheDir(),"cache.txt");
BufferedWriter writer = new BufferedWriter(newFileWriter(f)) ;
writer.write("hahahehe");
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
//2. 保存在应用的file中
try{
File f = new File(getFilesDir(),"file.txt");
BufferedWriter writer = new BufferedWriter(newFileWriter(f)) ;
writer.write("hahahehe");
writer.close();
} catch(IOException e) {
e.printStackTrace();
}
}
注意:清除数据会把data目录下改应用的所有数据都清除掉,而清除缓存则只会清除cache目录下的数据
4. 方法三:使用sharedPreference去保存
Xml 文件可以用来保存数据
注意: 使用sharedPreferences保存数据时, 生成的xml文件是
在 /data/data/包名/shared_prefs 目录下.
packagecom.example.aplex_new1.myapplication;importandroid.content.SharedPreferences;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;public class MainActivity extendsAppCompatActivity {
Button bt1;
EditText accountView;
EditText pwdView;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1=findViewById(R.id.bt);
accountView=findViewById(R.id.ed);
pwdView=findViewById(R.id.ed2);//获取到mydata.xml对象,没有则会创建一个
SharedPreferences sp = getSharedPreferences("mydata", 0);//拿到编辑器
SharedPreferences.Editor ed =sp.edit();//获取出mydata.xml中键值为account的数据
String account = sp.getString("account", "");//获取出mydata.xml中键值为pwd的数据
String pwd = sp.getString("pwd","");//显示出来
accountView.setText(account);
pwdView.setText(pwd);
bt1.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View view) {
SharedPreferences sp= getSharedPreferences("mydata", 0);
SharedPreferences.Editor ed=sp.edit();
String account=accountView.getText().toString();
String pwd=pwdView.getText().toString();//放入数据中
ed.putString("account", account);
ed.putString("pwd", pwd);//提交
ed.apply();
}
});
}
}
现象:第一次点击应用
账号密码都为空
在输入完账号密码后,退出,再次点击,则会回显出来
因为数据已经保存进了XML文件中去了
打开mydata.xml
1234567
1234567
4. 方法四:保存到公共的sd卡上:
1. 概念和代码
AndroidManifest.xml
android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">
SDFileHelper.java
public classSDFileHelper {
String TAG= "SDFileHelper";privateContext context;publicSDFileHelper() {
}publicSDFileHelper(Context context) {
super();this.context =context;
}//往SD卡写入文件的方法
public voidsavaFileToSD(String filename, String filecontent) throws Exception {//如果手机已插入sd卡,且app具有读写sd卡的权限
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename= Environment.getExternalStorageDirectory().getCanonicalPath() + "/" +filename;
Log.d(TAG,"文件名:"+filename);//这里就不要用openFileOutput了,那个是往手机内存中写数据的
FileOutputStream output = newFileOutputStream(filename);
output.write(filecontent.getBytes());//将String字符串以字节流的形式写入到输出流中
output.close();//关闭输出流
} else Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
}//读取SD卡中文件的方法//定义读取文件的方法:
publicString readFromSD(String filename) throws IOException {
StringBuilder sb= new StringBuilder("");if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filename= Environment.getExternalStorageDirectory().getCanonicalPath() + "/" +filename;//打开文件输入流
FileInputStream input = newFileInputStream(filename);byte[] temp = new byte[1024];int len = 0;//读取文件内容:
while ((len = input.read(temp)) > 0) {
sb.append(new String(temp, 0, len));
}//关闭输入流
input.close();
}returnsb.toString();
}
}
MainActivity.java
public classMainActivity extends AppCompatActivity implements View.OnClickListener{privateEditText editname;privateEditText editdetail;privateButton btnsave;privateButton btnclean;privateButton btnread;privateContext mContext;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=getApplicationContext();
bindViews();}private voidbindViews() {
editname=(EditText) findViewById(R.id.edittitle);
editdetail=(EditText) findViewById(R.id.editdetail);
btnsave=(Button) findViewById(R.id.btnsave);
btnclean=(Button) findViewById(R.id.btnclean);
btnread=(Button) findViewById(R.id.btnread);
btnsave.setOnClickListener(this);
btnclean.setOnClickListener(this);
btnread.setOnClickListener(this);
}
@Overridepublic voidonClick(View v) {switch(v.getId()){caseR.id.btnclean:
editdetail.setText("");
editname.setText("");break;caseR.id.btnsave:
String filename=editname.getText().toString();
String filedetail=editdetail.getText().toString();
SDFileHelper sdHelper= newSDFileHelper(mContext);try{
sdHelper.savaFileToSD(filename, filedetail);
Toast.makeText(getApplicationContext(),"数据写入成功", Toast.LENGTH_SHORT).show();
}catch(Exception e){
e.printStackTrace();
Toast.makeText(getApplicationContext(),"数据写入失败", Toast.LENGTH_SHORT).show();
}break;caseR.id.btnread:
String detail= "";
SDFileHelper sdHelper2= newSDFileHelper(mContext);try{
String filename2=editname.getText().toString();
detail=sdHelper2.readFromSD(filename2);
}catch(IOException e){e.printStackTrace();}
Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();break;
}
}
}
2. 6.0上SD卡的权限和动态申请权限的问题(重点!!)
Android6.0之后系统对权限的管理更加严格了,不但要在AndroidManifest中添加,还要在应用运行的时候动态申请。下面是动态申请SD卡读写的权限
1. 在AndroidManifest中添加SD卡读写的权限
2. 申请权限
申请权限有两种方式:
1). 手动打开权限:
Settings-->Apps-->找到所需要的应用-->Permissions-->打开权限
2). 在程序中动态申请权限(重点):
private static final int REQUEST_EXTERNAL_STORAGE = 1;private static String[] PERMISSIONS_STORAGE ={"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE"};public static voidverifyStoragePermissions(Activity activity) {try{//检测是否有写的权限
int permission =ActivityCompat.checkSelfPermission(activity,"android.permission.WRITE_EXTERNAL_STORAGE");if (permission !=PackageManager.PERMISSION_GRANTED) {//没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
}catch(Exception e) {
e.printStackTrace();
}
}
5. 方法五:使用数据库(MySQL)去保存