利用反射+SharedPreferences保存数据
SharedPreferences适用于保存少量的数据,比如用户的信息、游戏的进度等等。使用也非常的简单
//得到对象 sharedPreferences=context.getSharedPreferences("APP-name",Context.MODE_PRIVATE); //存数据 sharedPreferences.edit().putString(key,value).commit(); //取数据 sharedPreferences.getString(key, "默认值");
利用Java反射机制,可以动态的根据传入对象的不同,而进行保存。
如下所示,利用反射原理和SharedPreferences实现的数据保存和读取类,对外只公开save和get方法,分别用于存入和读取
public class SPutil { private SharedPreferences sharedPreferences; public SPutil(Context context){ this.sharedPreferences=context.getSharedPreferences("APP-name",Context.MODE_PRIVATE); } public void save(Object obj,Class c){ Field[] fs = c.getDeclaredFields(); for ( int i = 0 ; i < fs. length ; i++) { try { Field f = fs[i]; f.setAccessible(true); // 设置些属性是可以访问的 Object val = f.get(obj); // 得到此属性的值 String type = f.getType().toString(); // 得到此属性的类型 String name = f.getName();// 得到属性的名称 saveByType(type,name,val);//保存 } catch (Exception e) { e.printStackTrace(); } } } public Object get(Class c){ try { Object obj = Class.forName(c.getName()).newInstance(); Field[] fs = c.getDeclaredFields(); for ( int i = 0 ; i < fs. length ; i++) { Field f = fs[i]; f.setAccessible(true); // 设置些属性是可以访问的 String type = f.getType().toString(); // 得到此属性的类型 String name = f.getName(); //得到此属性的名称 Object value = this.getByType(type,name);//得到属性的值 f.set(obj,value);//设置此属性的值 } return obj; }catch(Exception e){ e.printStackTrace(); } return null; } private Object getByType(String type ,String key){ Object obj=null; if(type.endsWith("String")){ obj=sharedPreferences.getString(key, null); }else if(type.endsWith("int")||type.endsWith("Integer")){ obj=sharedPreferences.getInt(key,-100000); }else if(type.endsWith("boolean")){ obj=sharedPreferences.getBoolean(key,false); }else if(type.endsWith("Long")||type.endsWith("long")){ obj=sharedPreferences.getLong(key,-10000); }else if(type.endsWith("Float")||type.endsWith("float")){ obj=sharedPreferences.getFloat(key,-10000); } return obj; } private void saveByType(String type,String key,Object val){ if(type.endsWith("String")){ sharedPreferences.edit().putString(key,(String)val).commit(); }else if(type.endsWith("int")||type.endsWith("Integer")){ sharedPreferences.edit().putInt(key,(int)val).commit(); }else if(type.endsWith("boolean")){ sharedPreferences.edit().putBoolean(key,(boolean)val).commit(); }else if(type.endsWith("Long")||type.endsWith("long")){ sharedPreferences.edit().putLong(key,(Long)val).commit(); }else if(type.endsWith("Float")||type.endsWith("float")){ sharedPreferences.edit().putFloat(key,(Float)val).commit(); }else{ Log.d("Exception","类型无法识别"); } } }
以User类为例,以下是一个简单的User类,包含姓名、年龄、性别、工资、工号五中不同的数据类型。
public class User { private String name;; private int age; private boolean gender;//true男,false女 private float salary; private long EmployeeID; public User(){ } public User(String name, boolean gender, int age, float salary, long employeeID) { this.name = name; this.age = age; this.gender = gender; this.salary = salary; EmployeeID = employeeID; } public String getName() { return name; } public int getAge() { return age; } public boolean isGender() { return gender; } public float getSalary() { return salary; } public long getEmployeeID() { return EmployeeID; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setGender(boolean gender) { this.gender = gender; } public void setSalary(float salary) { this.salary = salary; } public void setEmployeeID(long employeeID) { EmployeeID = employeeID; } }
具体使用方法如下
SPutil sp=new SPutil(this); //存入 User user=new User("张三",true,18,3000,20162324); sp.save(user,User.class); //读取 User uu=(User)sp.get(User.class);
SharedPreferences存在XML文件当中的数据如下
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <long name="EmployeeID" value="20162324" /> <string name="name">张三</string> <int name="age" value="18" /> <boolean name="gender" value="true" /> <float name="salary" value="3000.0" /> </map>