【从零到一】Android数据存储(二) | SharedPreference
目录
什么是SharedPreference?
SharedPreference是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。
SharedPreference的特点
- 数据类型:支持基本数据类型,不支持自定义数据类型
- 存储:键值对方式存储
- 保存:保存到data/data/<package_name>/shared_prefs/中自定义的XML文件中
- 访问:默认情况下只能在APP内部访问
键值对方式是一种非结构化的存储方法,非结构化是指字段的存储不需要表与字段相互的关联关系,为单纯的Key-Value关系,非常简便轻量。
SharedPreference的使用
- 获取SharedPreference对象
- 将数据存入SharedPreference
- 从SharedPreference中读取数据
- 封装SharedPreference工具类
1.获取SharedPreference对象
方法 | 参数 | 作用 |
---|---|---|
PreferenceManager.getDefaultSharedPreferences(Context context) | context :上下文 | 创建以包名为前缀的XML文件 |
Activity.getSharedPreferences(String name,int mode) | 1.String name :文件名(无需后缀) 2.int mode :模式(如下4种) | 创建以name为文件名的XML文件 |
MODE_PRIVATE(只能该应用读写)
MODE_WORLD_READABLE(可以被其他应用读取,但不可写入)
MODE_WORLD_WRITEABLE(可被其他应用读写)
MODE_APPEND(检查文件是否存在,存在直接追加内容,不存在则直接创建)
获取SharedPreference对象:
SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
// SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件
2.将数据存入SharedPreference
方法 | 参数 | 作用 |
---|---|---|
SharedPreferences.edit() | 返回一个EditorImpl对象 | |
Editor.putXX(String key, int value) | 1.String key:键 2. int value:值 | 传入键值对形式数据 |
Editor.apply() | 将数据保存到磁盘中,异步保存(不会阻塞当前线程) | |
Editor.commit() | 将数据保存到磁盘中,同步保存 |
将数据存入SharedPreference:
private void initViews() {
mEtKey = findViewById(R.id.etKEY);
mEtValue = findViewById(R.id.etVALUE);
mBtnSave = findViewById(R.id.btnSave);
mBtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//保存用户输入的键值对
String key = mEtKey.getText().toString().trim();
String value = mEtValue.getText().toString().trim();
SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
// SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件
SharedPreferences.Editor editor = sharedpreferences.edit();//获取editorlmpl对象
editor.putString(key,value);//传入键值对形式的数据
// editor.commit();//同步保存
editor.apply();//异步保存(不会阻塞当前线程,推荐)
}
});
}
3.从SharedPreference中读取数据
方法 | 参数 | 作用 |
---|---|---|
SharedPreferences.getXX(String key, String defValue) | 1.String key:键 2.String defValue:找不到key时返回的指定值 | 读取数据 |
private void initViews() {
mEtReadKey =findViewById(R.id.etReadKEY);
mTvReadValue = findViewById(R.id.tvReadVALUE);
mBtnRead = findViewById(R.id.btnRead);
mBtnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//读取用户输入key的value
String key = mEtReadKey.getText().toString().trim();
SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo",MODE_PRIVATE);
String value = sharedpreferences.getString(key, "null");
mTvReadValue.setText(value);
}
});
}
4.封装SharedPreference工具类
回顾一下上面的内容:
向SharedPreference中存入数据的步骤:
- 获取SharedPreferences对象
- 获取EditorImpl对象
- 通过editor.putxx()写入键值对形式数据
- 提交数据
从SharedPreference中读取数据的步骤: - 获取SharedPreferences对象
- 通过getxx()获取key对应value的值
是不是觉得有点冗余繁琐,我们最终目的只是写入/读取SharedPreferences数据,那是不是能简化一下这个过程呢?是的,我们可以通过封装SharedPreferences工具类,简化我们的代码。
1.创建一个SharedPreferencesUtil类,将我们需要的put()/set()方法封装到这个工具类中:
public final class SharedPreferencesUtil {
private static final String FILE_NAME = "macardo";
private static SharedPreferencesUtil mInstance;
private SharedPreferencesUtil() {
}
//单例模式
public static SharedPreferencesUtil getInstance() {
if (mInstance == null) {
//synchronized 加锁,涉及多线程安全问题
synchronized (SharedPreferencesUtil.class) {
if (mInstance == null) {
mInstance = new SharedPreferencesUtil();
}
}
}
return mInstance;
}
//写入
public void put(Context context, String key, Object value) {
String type = value.getClass().getSimpleName();
SharedPreferences sharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
if ("Integer".equals(type)) {
editor.putInt(key, (Integer) value);
} else if ("Boolean".equals(type)) {
editor.putBoolean(key, (Boolean) value);
} else if ("String".equals(type)) {
editor.putString(key, (String) value);
} else if ("Float".equals(type)) {
editor.putFloat(key, (Float) value);
} else if ("Long".equals(type)) {
editor.putLong(key, (Long) value);
}
editor.apply();
}
//读取
public Object get(Context context,String key,Object defValue){
SharedPreferences sharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
String type = defValue.getClass().getSimpleName();
if ("Integer".equals(type)) {
return sharedPreferences.getInt(key,(Integer) defValue);
} else if ("Boolean".equals(type)) {
return sharedPreferences.getBoolean(key,(Boolean) defValue);
} else if ("String".equals(type)) {
return sharedPreferences.getString(key,(String) defValue);
} else if ("Float".equals(type)) {
return sharedPreferences.getFloat(key,(Float) defValue);
} else if ("Long".equals(type)) {
return sharedPreferences.getLong(key,(Long) defValue);
}
return null;
}
}
2.在MainActivity中调用:
private void initViews() {
mEtKey = findViewById(R.id.etKEY);
mEtValue = findViewById(R.id.etVALUE);
mBtnSave = findViewById(R.id.btnSave);
mEtReadKey =findViewById(R.id.etReadKEY);
mTvReadValue = findViewById(R.id.tvReadVALUE);
mBtnRead = findViewById(R.id.btnRead);
mBtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//保存用户输入的键值对
String key = mEtKey.getText().toString().trim();
String value = mEtValue.getText().toString().trim();
/*
SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
// SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件
SharedPreferences.Editor editor = sharedpreferences.edit();//获取editorlmpl对象
editor.putString(key,value);//传入键值对形式的数据
// editor.commit();//同步保存
editor.apply();//异步保存(不会阻塞当前线程,推荐)
*/
SharedPreferencesUtil.getInstance().put(MainActivity.this,key,value);
}
});
mBtnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//读取用户输入key的value
String key = mEtReadKey.getText().toString().trim();
/*
SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo",MODE_PRIVATE);
String value = sharedpreferences.getString(key, "null");
*/
String value = (String) SharedPreferencesUtil.getInstance().get(MainActivity.this, key, "null");
mTvReadValue.setText(value);
}
});
}
3.OK,这样一来就简洁多了。好了关于SharedPreference就总结到这里,希望对你有所帮助。
Github项目地址: Macardo-MySharedPreference.