利用反射+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>
posted @ 2016-09-02 11:19  黄大仙爱编程  阅读(201)  评论(0编辑  收藏  举报