Android常用数据存储方式有SharedPreferences存储数据(虽然还是属于内部存储)、文件存储(内部,外部)、SQLite数据库存储、ContentProvider存储数据、网络存储数据等几种。本篇博客主要是介绍Shared Preference的原理与使用,区分内部与外部文件存储,以及它们的使用方式。那就从清除缓存与清除数据到底清除了什么这个问题开始吧!
内部存储 InternalStorage
在Android开发中,内存 Memory、内部存储 InternalStorage、外部存储 ExternalStorage这三者有啥区别呢? 在我们打开手机设置 -> 应用管理,随便选择一个软件,然后会看到一个是清除缓存的按钮,一个清除数据的按钮,那么当点击清除缓存的时候清除的是哪里的数据?当点击清除数据的时候又是清除的哪里的数据呢? 打开Device File Explorer会看到如下目录结构:
其实在使用SharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,App里边的数据库文件就存储于databases文件夹中,还有我们的普通数据存储在files中,缓存文件存储在cache文件夹中,存储在这里的文件我们都称之为内部存储。
下面来说说使用内部存储的代表——SharedPreferences,SharedPreferences也是在开发中使用的比较多的一种方案,用于存放一些类似登录的配置等信息。
SharedPreferences
1、用于存放一些类似登录的配置信息 2、本质上是一个xml文件,是通过类似键值对的方式存放信息 3、位于程序私有目录中,即data/data/[packageName]/shared_prefs
SharedPreferences的操作模式 1、MODE_APPEND:追加方式存储 2、MODE_PRIVATE:私有方式存储,其他应用无法访问 3、MODE_WORLD_READABLE:可被其他应用读取 4、MODE_WORLD_WRITEABLE:可被其他应用写入
SharedPreferences使用方式:
// 取数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etUserName = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
SharedPreferences login_info = getSharedPreferences("login_info", MODE_PRIVATE);
// 第一个参数为Key,第二个是默认值
etUserName.setText(login_info.getString("user_name", ""));
etPassword.setText(login_info.getString("password", ""));
}
// 存储据
public void userLogin(View view) {
String userName = etUserName.getText().toString();
String password = etPassword.getText().toString();
if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password)){
Toast.makeText(MainActivity.this, "输入不完整", Toast.LENGTH_SHORT).show();
}
// 存储输入的信息
// 1、拿到SharedPreference对象
SharedPreferences loginInfoSP = getSharedPreferences("login_info", MODE_PRIVATE);
// 2、获取Editor对象
SharedPreferences.Editor editor = loginInfoSP.edit();
// 3、通过Editor存储数据
editor.putString("user_name", userName);
editor.putString("password", password);
// 3、调用提交方法
boolean commit = editor.commit();
Log.i(TAG, "userLogin: commitRet = " + commit);
// 校验登录结果
if(!("admin".equals(userNam