日常开发中我们常常要用到保存数据,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 sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
//获取editor对象
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);
//getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
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) {// obj必须实现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对象
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