日常开发中我们常常要用到保存数据,Android中常用的存储方式有SQLite,sharedPreferences 等,当然也有各自的应用场景,前者适用于保存较多数据的情形,后者责倾向于保存用户偏好设置比如某个checkbox的选择状态,用户登录的状态、配置信息,实现记住密码功能等等,都是以键值对的形式进行的文件读取。
但是每存储一个数据都要提供一个key,如果要存储多个数据那岂不是要写多个key?例如我们要保存一个用户的登录信息,比如用户昵称,个性签名,登录时间………尼玛我一条数据写一个的话我都可以玩一盘撸啊撸了~反正我是受不了~那么我们能否将用户信息封装起来,统一以一个key来保存呢?答案是肯定可以的~
Java类库中提供的字节输入输出流可以轻松帮我们完成任意类型到String的可逆转换,继而我们就可以保存到Share中了~
SharedPreferences只能保存简单类型的数据,例如四种基本类型(int,float,long,boolean)+String。如果需要存取比较复杂的数据类型比如类或者图像,则需要对这些数据进行编码,通常将其转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。
简单使用:
可保存的类型:
string,int,float,long,boolean
SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("name", "周杰伦");
editor.putInt("age", 24);
editor.putBoolean("isMarried", false);
editor.putLong("height", 175L);
editor.putFloat("weight", 60f);
editor.putStringSet("where", set);
editor.commit();
SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
存储对象:
方法一:fastJson/Gson/Jackson将对象转换成字符串,然后再保存。
方法二:ObjectOutputStream将对象转化成流,base64将流转成字符串,然后再保存。
package com.example.draggridview;
/** * Created by Administrator on 2017/6/19. */
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/** * SharedPreferences工具类,可以保存object对象 */
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);
String string64 = new String(Base64.encode(baos.toByteArray(), 0));
SharedPreferences.Editor editor = getSharedPreferences(context).edit();
editor.putString(key, string64).commit();
} catch (IOException e) {
e.printStackTrace();
}
} else {
throw new IllegalArgumentException("the obj must implement Serializble");
}
}
public static Object getBean(Context context, String key) {
Object obj = null;
try {
String base64 = getSharedPreferences(context).getString(key, "");
if (base64.equals("")) {
return null;
}
byte[] base64Bytes = Base64.decode(base64.getBytes(), 1);
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
obj = ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
参考:
使用SharedPreference保存list数据,其实可以保存Object对象
Android开发笔记——SharedPreferences 存储实体类以及任意类型
Android数据持久化之SharedPreference
AIDL支持的数据类型
- 所有基础类型(byte/short/int/long/float/double/boolean/char 等)
- String,List,Map,CharSequence等类
- 其他AIDL接口类型
- 所有Parcelable的类
bundle可传递数据类型:
1、byte/short/int/long/float/double/boolean/char等八种基本类型或它们对应的数组,
2、String、charsequence或对应的数组,也可以是对象()或对象数组。
3、Bundle.putSerializable(Key,Object); //实现Serializable接口的对象
4、Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象
intent可传递数据类型:
intent传递类型(abcd)
A、Serializable B、charsequence C、Parcelable D、Bundle
1、八种基本数据类型 及其对应数组
2、String/Charsequence 及其对应数组
3、Parcelable 及其对应数组 /Serializable
4、bundle/intent
使用步骤:
1、得到SharedPreferences对象
2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
3、向SharedPreferences.Editor对象中添加数据。
4、调用commit方法将添加的数据提交。
详细过程:
1、得到SharedPreferences对象
方法1:
Context.getSharedPreferences(文件名称,操作模式)
文件名称不存在就会创建一个,操作模式有两种:
MODE_PRIVATE:默认操作模式,直接在把第二个参数写0就是默认使用这种操作模式,这种模式表示只有当前的应用程序才可以对当前这个SharedPreferences文件进行读写。
MODE_MULTI_PRIVATE:用于多个进程共同操作一个SharedPreferences文件。
注:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式已经在android 4.2版本以后废弃了。
方法2:
Activity.getPreferences(操作模式)
使用这个方法会自动将当前活动的类名作为SharedPreferences的文件名,底层调用的是下面这个方法
Activity.getSharedPreferences(String name, int mode)我们也可以直接调用getSharedPreferences这个方法,传入自定义的名字。
方法3
PreferenceManager.getDefaultSharedPreferences(Context)
使用这个方法会自动使用当前程序的包名作为前缀来命名SharedPreferences文件
2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
SharedPreferences.Editor editor = getSharedPreferences(“data”,MODE_PRIVATE).edit();
3、向SharedPreferences.Editor对象中添加数据。
editor.putString(“name”,”Lily”); //以键值对形式存储
editor.putInt(“age”,”20”); //以键值对形式存储
editor.putBoolean(“married”,false); //以键值对形式存储
4、调用commit方法将添加的数据提交。
editor.commit();
代码示例:
SharedPreferences pref = MainActivity.this.getSharedPreferences(“data”,MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(“name”,”lily”);
editor.putString(“age”,”20”);
editor.putBoolean(“married”,false);
editor.commit();
如果要读取数据:
SharedPreferences pref = getSharedPreferences(“data”,MODE_PRIVATE);
String name = pref.getString(“name”,”“);//第二个参数为默认值
int age = pref.getInt(“age”,0);//第二个参数为默认值
boolean married = pref.getBoolean(“married”,false);//第二个参数为默认值
保存对象:
Android使用SharedPreferences保存对象 - 推酷
http://www.tuicool.com/articles/6nAZrq
保存list:
可以将list转化为json字符串,然后以string的形式保存,使用的时候先取出这个string再解析json得到list。