转自https://www.cnblogs.com/smyhvae/p/4019379.html,感谢作者的分享。
一、Android数据的存储方式:
Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File;此外还有一种网络存储。由于Android系统中,数据基本都是私有的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。
在Android中,可以使用几种方式实现数据持久化:
- Shared Preferences:除SQLite数据库外,另一种常用的数据存储方式。共享参数形式,一种以Key-Value的键值对形式保存数据的方式,其本质就是一个xml文件。Android内置的,一般应用的配置信息,推荐使用此种方式保存。
- Internal Storage:使用Android设备自带的内存存储数据。
- External Storage:使用外部存储设备存储数据,一般是指Sdcard。
- SQLite Databases:以SQLite数据库存储结构化的数据。SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
- Network Connection:使用基于网络的服务获取数据。
二、Android的文件系统:
1、Android系统文件目录:
2、Android的应用数据存储机制:
在Android中,第三方应用及其数据,都存放在data目录下。其中,应用安装包会被存放到/data/app/目录下,每个安装包的文件名都形如:应用包名.apk,以避免重复。比如包名为com.test.sample的应用,其应用数据的目录为/data/data/com.test.sample/。对应的数据库文件存储在/data/data/com.test.sample/database/目录下,设置文件存储在/data/data/com.test.sample/shared_prefs/,自定义的应用数据文件存储在目录/data/data/com.test.sample/files/下,等等。
不仅如此,Android还会为每个应用创建一个账号,只有通过本应用的账号才有权限去运行该应用的安装包文件,读写应用数据目录下的文件(当然root权限除外),从而保证了该应用数据不会再被其他应用获取或破坏。
3、Android的文件操作:
从应用数据目录下可以看出,数据文件可以分成两类,一类是放置在扩展存储器中的文件,即/sdcard/目录下的文件,它们可以被各个应用共享;而另一类则是放在该应用数据目录下文件,它们仅能被各个应用独享,不能被其他应用读写。
三、SharedPreferences:
在所有应用程序中,都必然涉及数据的交互。有些时候,应用程序有少量的数据需要保存,并且这些数据的格式很简单。比如:软件设置、用户账户设置,用户习惯设置等,这个时候就可以用到SharedPreferences。
其实,SharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式,并且是使用键值对的方式来存储数据的。对于一个Android应用,它存贮在文件系统的/data/data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity 访问。Android 提提供了相关的API来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步的问题。
因为SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences的实例:
public abstract SharedPreferences getSharedPreferences(String name,int mode)
此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个。SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/目录下的;第二个参数用于指定操作模式:
- MODE_PRIVATE:默认操作模式,和直接传0效果相同,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写
- MODE_WORLD_READABLE:指定此SharedPreferences对其他程序只读且无法修改。
- MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序读写。
- MODE_MULTI_PROCESS:Android2.3之后已经弃之不用了。
得到SharedPreferences对象后,就可以向SharedPreferences文件中存储数据了,主要分为以下三步:
- 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
- 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean方法,添加一个字符串就用putString()方法,以此类推
- 调用commit()方法将添加的数据提交,从而完成数据存储操作
public class MainActivity extends AppCompatActivity {
private Button loginBtn;
private EditText userNameET;
private EditText passwordET;
private CheckBox rememberCB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
loginBtn=findViewById(R.id.loginBtn);
userNameET=findViewById(R.id.userNameET);
passwordET=findViewById(R.id.passwordET);
rememberCB=findViewById(R.id.rememberCB);
SharedPreferences sp = getSharedPreferences("config", 0);
//如果找到了userName的值,那么就返回userName的值,否则就返回后面的默认值
String userName = sp.getString("userName", "");
String password = sp.getString("password", "");
userNameET.setText(userName);
passwordET.setText(password);
loginBtn.setOnClickListener(new MyOnClickListener());
}
//登录的方法
public void login(){
String userName = userNameET.getText().toString().trim();
String password = passwordET.getText().toString().trim();
//判断是否已经输入了用户名和密码
if(TextUtils.isEmpty(userName)||TextUtils.isEmpty(password)){
Toast.makeText(this,"请输入qq号码和密码",Toast.LENGTH_SHORT).show();
return;
}
//判断是否已经勾选了checkbox,如果已经勾选了则保存userName和password
boolean checked = rememberCB.isChecked();
if(checked){
//保存数据
try {
//使用sharedPreference将数据保存起来
//config文件(一个xml格式的文件)将会生成在应用的文件夹下
//一般情况下,应用本身的数据 只有 当前应用本身可以去读,所有通常会写
SharedPreferences sp = getSharedPreferences("config", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString("userName",userName);
edit.putString("password",password);
edit.commit();
Toast.makeText(this,"勾选了,保存成功",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}else{
Toast.makeText(this,"未勾选",Toast.LENGTH_SHORT).show();
}
}
private class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
int id = v.getId();
if(id==R.id.loginBtn){
login();
}
}
}
}