有没有一个简单的方法直接存取Object到SharedPrence中去呢?这儿有一个不错的方案。

Posted 汤米粥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有一个简单的方法直接存取Object到SharedPrence中去呢?这儿有一个不错的方案。相关的知识,希望对你有一定的参考价值。

封装一个工具类,自动拆分Object的属性,保存到SharedPreference。

场景是这样的:假如我们有很多个属性要保存到sharedprence中去,如果一个个的去commit会比较麻烦,而且不便于管理,所以我想将这些属性放在一个对象中,这个工具类就是用反射的方式遍历这个对象的属性,key就是属性名,value就椒属性值,自动将所有的属性和值保存到sharedprenced中去。

工具类如下:

import android.util.Log;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ClassSetAndGetKeyAndValue 

    private OnGetCallBack mGetCall;
    private OnSetCallBack mSetCall;
    private Class<?> mClass;
    private Object mObj;

    private ClassSetAndGetKeyAndValue(Class<?> cs) 
        mClass = cs;
    

    public ClassSetAndGetKeyAndValue(Object obj, OnGetCallBack call) 
        mObj = obj;
        mGetCall = call;
    

    public ClassSetAndGetKeyAndValue(Class<?> cs, OnSetCallBack call) 
        this(cs);
        mSetCall = call;
    

    /**
     * 获取集合
     *
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public List<Object> startRunDatas() throws InstantiationException, IllegalAccessException 
        boolean is = true;
        List<Object> lists = new ArrayList<Object>();
        while (is) 
            mObj = mClass.newInstance();
            Object obj = startRunData();
            if (obj == null) 
                return lists;
            
            Log.i("you" , "添加了一个对象"+obj.toString());
            lists.add(obj);
            Log.i("you" , "添加对象成功个数"+lists.size());
        
        return lists;
    

    /**
     * 加载数据
     *
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public Object startRunData() throws InstantiationException, IllegalAccessException 
        boolean is = true;
        if (mObj == null)
            mObj = mClass.newInstance();
        Class<? extends Object> c = mObj.getClass();

        for (; c != Object.class; c = c.getSuperclass()) 
            Field fs[] = c.getDeclaredFields();
            for (Field f : fs) 
                String name = f.getName();
                String value = "";
                f.setAccessible(true);
                if (mSetCall != null) 
                    Object obj = mSetCall.setCall(name, is);
                    is = false;
                    if (obj == null) return null;
                    if (obj instanceof String) 
                        String v = obj.toString();
                        if (v.length() != 0)
                            f.set(mObj, v);
                        continue;
                    else
                        f.set(mObj, obj);
                    
                 else 
                    if (f.get(mObj) instanceof String) 
                        value = (String) f.get(mObj);
                    
                
                if (mGetCall != null) 
                    mGetCall.onCall(name, value);
                

            
        
        return mObj;
    

    public static void getObjectListKeyAndValue(Object obj, final List<String> keys, final List<String> values) throws InstantiationException, IllegalAccessException 
        new ClassSetAndGetKeyAndValue(obj, new OnGetCallBack() 

            @Override
            public void onCall(String key, String value) 
                if (keys != null)
                    keys.add(key);
                if (values != null)
                    values.add(value);
            
        ).startRunData();
    


    public interface OnSetCallBack 
        /**
         * @param key     需要获取值的key
         * @param isStart 是否是重新开始的
         * @return
         */
        public Object setCall(String key, boolean isStart);
    

    public interface OnGetCallBack 
        public void onCall(String key, String value);
    

 

public class DataSharedPreferences 
	
	private Context mCon;
	
	public DataSharedPreferences(Context context)
		mCon = context;
	
	
	public Object getData(Class<?> cs , String name ) throws InstantiationException, IllegalAccessException
		return getData(cs , name , Context.MODE_PRIVATE);
	
	
	public Object getData(Class<?> cs , String name , int mode) throws InstantiationException, IllegalAccessException
		
		final SharedPreferences share = getSharedPreferences(name, mode);
		
		share.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() 
			
			@Override
			public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
					String key) 

			
		);
		ClassSetAndGetKeyAndValue kv = new ClassSetAndGetKeyAndValue(cs, new ClassSetAndGetKeyAndValue.OnSetCallBack() 
			
			@Override
			public String setCall(String key , boolean isStart) 
				return share.getString(key, "");
			
		);
		return kv.startRunData();
		
	
	
	public boolean saveData(Object obj ,String name , int mode)
		
		final SharedPreferences share = getSharedPreferences(name, mode);
		final SharedPreferences.Editor editor = share.edit();
		
		try 
			new ClassSetAndGetKeyAndValue(obj, new ClassSetAndGetKeyAndValue.OnGetCallBack() 
				
				@Override
				public void onCall(String key, String value) 
					editor.putString(key, value);
				
			).startRunData();
		 catch (InstantiationException e) 
			e.printStackTrace();
			return false;
		 catch (IllegalAccessException e) 
			e.printStackTrace();
			return false;
		
		editor.commit();
		return true;
	
	
	public void clearData(String name , int mode)
		final SharedPreferences share = getSharedPreferences(name, mode);
		share.edit().clear().commit();
	
	
	
	private SharedPreferences getSharedPreferences(String name , int mode)
		return mCon.getSharedPreferences(name, mode);
	
	
	

使用方法:

//取对象    
public Object getDataFromSharePreferences(Class<?> cs, String fileName) 
        mSharePreferences = getDataSharePreferences();
        try 
            return mSharePreferences.getData(cs, fileName);
         catch (Throwable e) 
            e.printStackTrace();
        
        return null;
    

   
    //存对象
    public boolean saveDataToSharePreferences(Object obj, String fileName) 
        mSharePreferences = getDataSharePreferences();
        return mSharePreferences.saveData(obj, fileName, Activity.MODE_PRIVATE);
    

以上是关于有没有一个简单的方法直接存取Object到SharedPrence中去呢?这儿有一个不错的方案。的主要内容,如果未能解决你的问题,请参考以下文章

Object.defineProperty()死循环的问题

ThinkPHP 缓存技术详解 使用大S方法

JavaScript高级对象相关:对象属性属性描述符(数据属性,存取属性)

JavaScript高级对象相关:对象属性属性描述符(数据属性,存取属性)

基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)

OGNL