数据存储可以说是Android开发中的重点了,所以弄懂数据存储是非常必要的。下面是SharedPreferences的简单使用:
一、Android数据的存储方式:
Android系统一共提供了四种数据存储方式。SharedPreferences、SQLite、ContentProvider和File存储,其实这四种都是本地存储,所以与之对应的还有网络存储,这篇文章重点介绍的是第一个SharedPreferences,有兴趣的可以自行研究其他几种存储方式。由于Android系统的数据基本都是私有的,要实现不同应用之间数据共享,推荐使用ContentProvider。
二、Android的文件系统
system :系统目录,放置在Android运行所需的核心库
data:应用目录,放置着运行在Android上的应用以及数据
sdcard:外部存储,用来存放共享数据
mnt:记录Android挂载的外部存储信息
三、SharedPreferences比较适用于保存用户偏好设置、用户登录的状态、软件配置信息、记住密码等等,它们都是以键值对的形式进行文件的读取。是一种轻量级的永久存储。
SharedPreferences可以实现简单类型的数据的永久存储,比如四种基本类型(int、float、long、boolean),还有String类型以及String集合。如果要存取比较复杂的数据类型比如类或者图像,通常需要将这些数据进行编码,比如转换成Base64编码,然后将转换后的数据编码以字符串的形式保存在XML文件中。
3.1、存储简单类型的数据
/*
* 1.获取SharedPreference对象
* 2.获取Edtor对象
* 3.存储信息
* 4.提交操作
* */
//获取SharedPreference对象(参数1:文件名 参数2:模式)
SharedPreferences share=getSharedPreferences("myshare",MODE_PRIVATE);
//获取Editor对象
SharedPreferences.Editor editor=share.edit();
//存储数据
editor.putString("account",account);
editor.putString("pwd",pwd);
editor.putBoolean("status",true);
editor.putInt("int",1);
editor.putLong("time",2018122L);
editor.putFloat("float",33f);
editor.putStringSet("country",stringSet);
//提交修改
editor.commit();
因为SharedPreferences本质上是使用xml文件保存数据的,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀;第二个参数指定文件的操作模式,现在基本只推荐使用MODE_PRIVATE,其他的,如:MODE_WORLD_READRABLE、MODE_WORLD_WRITEABLE、MODE_MULTI_PROCESS等基本被弃用了。
3.2、读取SharedPreferences中的数据
//SharedPreference的读取
/*
* 1.获取SharedPreference对象(参数1:文件名 参数2:模式)
* 2.根据key获取内容(参数1:key 参数2:当对应key不存在时,返回参数2的内容作为默认值)
* */
SharedPreferences share=getSharedPreferences("myshare",MODE_PRIVATE);
//获取用户名,缺省值为空
String accountStr=share.getString("account","");
//获取密码,缺省值为空
String pwdStr=share.getString("pwd","");
实例:
myshare.xml文件
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="account">admin</string>
<string name="pwd">123456</string>
</map>
3.3、存储对象
存储对象有两种方法:
方法一:使用Gson中提供的转换工具,将对象转换成字符串,然后进行保存
方法二:ObjectOutputStream将对象转换成流,再用Base64将流转换成字符串,然后进行保存
实现了序列化接口的实体类:
public class Student implements Serializable{
private String id;
private String name;
private String sex;
private String grade;
//无参构造
public Student() {
}
//带参构造
public Student(String id, String name, String sex, String grade) {
this.id = id;
this.name = name;
this.sex = sex;
this.grade = grade;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", grade='" + grade + '\'' +
'}';
}
}
实现SharedPreferences存储的工具类:
public class SharedPreferenceUtil {
/*
* @param context
* @param key
* @param obj
* */
//将对象转换成字符串进行存储
public static void putBean(Context context,String key,Object obj){
//必须实现序列化接口
if (obj instanceof Serializable){
try {
//生成一个数组输出流
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//生成一个对象输出流
ObjectOutputStream oos=new ObjectOutputStream(baos);
//写入对象
oos.writeObject(obj);
//base64将流转传成字符串
String string64 = new String(Base64.encode(baos.toByteArray(),0));
SharedPreferences preferences=context.getSharedPreferences("studentShare",Context.MODE_PRIVATE);
//获取编辑器
SharedPreferences.Editor editor=preferences.edit();
//存入数据
editor.putString(key,string64);
//提交修改
editor.commit();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
//读取字符串,生成对象
public static Object getBean(Context context,String key){
Object obj=null;
try {
String base64 = context.getSharedPreferences("studentShare", Context.MODE_PRIVATE).getString(key, "");
if (base64.equals("")) {
return null;
} else {
byte[] base64Bytes = Base64.decode(base64.getBytes(), 0);
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
obj = ois.readObject();
}
}catch(IOException e){
e.printStackTrace();
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
return obj;
}
}
生成的studentShare.xml文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="student">rO0ABXNyAC1jb20uZXhhbXBsZS5qaWFoby5zdG9yYWdlcHJvamVjdC5iZWFuLlN0dWRlbnTgWJCr
CZRe0AIABEwABWdyYWRldAASTGphdmEvbGFuZy9TdHJpbmc7TAACaWRxAH4AAUwABG5hbWVxAH4A
AUwAA3NleHEAfgABeHB0AAIxMnQABDEyMzR0AAVuaWhhb3QAA21lbg==
</string>
</map>