Android数据存储的方式有种,主要有三种。分别为:文件存储,SharedPreference存储,以及数据库存储。
这篇主要讲SharedPreference存储。
1.基本据介绍
SharedPreference是使用键值对来存储的。当保存数的时候需要提供一个对应的建,装在读取的时候就可以把对应的值取处来了。同时还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么取出来的也是整型。
Android中一共提供了3中方法用于得到SharedPreference对象。
1.1、Context类中的getSharedPreferences(String name, @PreferencesMode int mode)方法
name:指定名称
路径:data/data/包名/shared_prefs/文件名
mode:
MODE_PRIVATE, 只有当前应用才可以打开这个。
MODE_WORLD_READABLE, 4.2被废除
MODE_WORLD_WRITEABLE, 4.2被废除
MODE_MULTI_PROCESS,6.0被废除
1.2、Activity中 getPreferences(@Context.PreferencesMode int mode)
mode:MODE_PRIVATE
这个和Context类中的getSharedPreferences基本一致只不过是只需要添加mode,因为name是默认的activity类名作为文件名
1.3、PreferenceManager中的getDefaultSharedPreferences(Context context)
他是一个静态方法,接收一个Context参数,自动使用当前应用程序的包作为前缀来命名文件。得到SharedPreferences对象后就可以存储数据了。具体分三步:
第一步:调用SharedPreferences对象的edit()方法或获取一个SharedPreferences.Editor对象
第二步:向SharedPreferences.Editor对象中添加数据
第三步:调用aplay方法将添加的数据提交,完成数据存储。
2.举例说明:
保存:
//data/data/包名/shared prefs/文件名
SharedPreferences.Editor data = getSharedPreferences("data", MODE_PRIVATE).edit();
data.putString("name", "李明");
data.putInt("age", 10);
data.putBoolean("married", false);
data.apply();
SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor edit = defaultSharedPreferences.edit();
获取:
SharedPreferences data = getSharedPreferences("data", MODE_PRIVATE);
String name = data.getString("name", "");
int age = data.getInt("age", 0);
boolean married = data.getBoolean("married", true);
tv.setText("name:" + name + '\n' +
"age:" + age + '\n' +
"married:" + married + '\n'
);
找到的他导出:
3.补充 SPUtils
public class SPUtils {
/**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "share_data";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param context
* @param key
* @param object
*/
public static void put(Context context, String key, Object object) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
SharedPreferencesCompat.apply(editor);
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param context
* @param key
* @param defaultObject
* @return
*/
public static Object get(Context context, String key, Object defaultObject) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* 移除某个key值已经对应的值
*
* @param context
* @param key
*/
public static void remove(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
}
/**
* 清除所有数据
*
* @param context
*/
public static void clear(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
}
/**
* 查询某个key是否已经存在
*
* @param context
* @param key
* @return
*/
public static boolean contains(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.contains(key);
}
/**
* 返回所有的键值对
*
* @param context
* @return
*/
public static Map<String, ?> getAll(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
return sp.getAll();
}
/**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*
* @author zhy
*/
private static class SharedPreferencesCompat {
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*
* @return
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static Method findApplyMethod() {
try {
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("apply");
} catch (NoSuchMethodException e) {
}
return null;
}
/**
* 如果找到则使用apply执行,否则使用commit
*
* @param editor
*/
public static void apply(SharedPreferences.Editor editor) {
try {
if (sApplyMethod != null) {
sApplyMethod.invoke(editor);
return;
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
editor.commit();
}
}
}
转发表明出处:https://blog.csdn.net/qq_35698774/article/details/106669945
android互助群:
感谢:郭霖的《第一行代码 第二版》
工具类感谢:https://blog.csdn.net/lmj623565791/article/details/38965311