1.将我们想要保存的数据封装成一个实体类 Person.java 其中属性我们都用Public来修饰
public class Person { //String类型属性 姓名 public String name; //int类型属性 年龄 public int age; //float类型属性 身高 public float height; //boolean类型属性 是否已婚 public boolean isMarried; //String类型属性 证件号 public String id; }
2.通过反射,将Person类中的属性取出来
public class SharedPreferencesUtils { /** * 根据传入的对象,取出其中用public修饰符修饰的属性 * @param clazz 想要拿到属性的类的字节码文件 * @return 所有用pulic修饰的属性的一个list表 */ public static <T> List<Field> getPublicFields(Class<?> clazz){ if (clazz.equals(Object.class)) { return null; } //用来存储clazz中用public修饰的属性的list List<Field> list = new ArrayList<Field>(); //获得clazz中所有用public修饰的属性 Field[] fields = clazz.getFields(); //将fields加入到list中 for(int i=0 ; i<fields.length ; i++){ list.add(fields[i]); } return list; }
我们先来测试一下属性有没有被取出来,我们在MainActivity.java中添加如下代码进行测试
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //调用我们刚刚写好的方法来获取Person类中的属性 List<Field> publicFields = SharedPreferencesUtils.getPublicFields(Person.class); for(Field f : publicFields){ String name = f.getName(); Log.i("TAG", name+"\n"); } } }
我们来看一下Log打印的信息
我们可以看到,Person中的属性我们都已经拿到了
3.将对象存储到SharedPreferences中
public static void putObjectToShare(String shareName , Object obj){ //获得SharedPreferences实例 SharedPreferences sharedPreferences = mContext.getSharedPreferences(shareName,Activity.MODE_PRIVATE); //获得Editor Editor edit = sharedPreferences.edit(); //存储数据之前先将之前的旧数据清掉 edit.clear(); //调用commit提交数据(这里为了清掉数据) edit.commit(); List<Field> publicFields = getPublicFields(obj.getClass()); for(Field f : publicFields){ String name = f.getName(); try { //获得当前属性的类型和值 //类型的话如果是基本类型,会自动装箱 Object type = f.get(obj); //判断各种类型,调用各种类型的put方法将数据存储进去 if (type instanceof String) { edit.putString(name, (String) type); }else if (type instanceof Integer) { edit.putInt(name, (Integer) type); }else if (type instanceof Float) { edit.putFloat(name, (Float) type); }else if (type instanceof Long) { edit.putLong(name, (Long) type); }else if (type instanceof Boolean) { edit.putBoolean(name, (Boolean) type); } } catch (Exception e) { e.printStackTrace(); } //调用commit,提交数据 edit.commit(); } }
4.将对象从SharedPreferences中取出来
public static <T> T getObjectFromShare(String shareName , Class<T> clazz){ //获得SharedPreferences实例 SharedPreferences sharedPreferences = mContext.getSharedPreferences(shareName, Activity.MODE_PRIVATE); //T是一个泛型,根据clazz不同而不同 T t = null; try { //获得sharedPreferences中所有的数据,数据为键值对保存在map中 Map<String,?> map = sharedPreferences.getAll(); //调用getPublicFields方法得到clazz中所有的公有属性 List<Field> publicFields = getPublicFields(clazz); //如果两者都不为空的话 if (map.size()>0 && publicFields.size()>0) { //将T实例化出来 t = clazz.newInstance(); //遍历map中所有的键值对 for(Map.Entry<String,?> entry : map.entrySet()){ //map中的键 String key = entry.getKey(); //map中的值 Object value = entry.getValue(); //遍历clazz中的所有公有属性 for(Field field : publicFields){ //获得属性名 String name = field.getName(); //如果属性名与键相同 if (name.equalsIgnoreCase(key)) { //相当于给对象T中的属性field赋值,值为value field.set(t, value); break; } } } } } catch (Exception e) { e.printStackTrace(); } //整个遍历结束后,我们的对象中的属性也都有值了 return t; }
5.我们来测试一下,修改MainAcitvity.java中的代码
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化一个Person实例,这是我们想要存储到SharedPreferences中的对象 Person p = new Person("zhangsan",23,175.0f,false,"001"); //将p存储到SharedPreferences的“zhangqi”名下 SharedPreferencesUtils.getInstance(this).putObjectToShare("zhangqi",p);; //从SharedPreferences的“zhangqi”名下取出之前存储过的Person实例 Person savedPerson = SharedPreferencesUtils.getInstance(this).getObjectFromShare("zhangqi",Person.class); Log.e("zhangqi",""+savedPerson.toString()); } }
我们看一下Log中打印的savedPerson的信息
时间: 2024-11-06 09:26:44