content: package com.github.airsaid.accountbook.util;
  
  import android.content.Context;
  import android.content.SharedPreferences;
  
  import com.github.airsaid.accountbook.constants.AppConstants;
  
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.util.Map;
  
  /**
   * Created by zhouyou on 2016/6/24.
   * Class desc:
   *
   * SharedPreferences封装工具类.
   */
  public class SPUtils {
  
      private SPUtils() {
          throw new UnsupportedOperationException("cannot be instantiated");
      }
  
      /**
       * SharedPreferences存储在sd卡中的文件名字
       */
      private static String getSpName(Context context) {
          return context.getPackageName() + "_preferences";
      }
  
      /**
       * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
       */
      public static void setSP(Context context, String key, Object object) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
          SharedPreferences.Editor editor = sp.edit();
  
          if (object instanceof String) {
              editor.putString(key, (String) object);
          } else if (object instanceof Integer) {
              editor.putInt(key, (Integer) object);
          } else if (object instanceof Boolean) {
              editor.putBoolean(key, (Boolean) object);
          } else if (object instanceof Float) {
              editor.putFloat(key, (Float) object);
          } else if (object instanceof Long) {
              editor.putLong(key, (Long) object);
          } else {
              editor.putString(key, object.toString());
          }
  
          SharedPreferencesCompat.apply(editor);
      }
  
      /**
       * 得到保存数据的方法，我们根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
       */
      public static Object getSP(Context context, String key, Object defaultObject) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
  
          if (defaultObject instanceof String) {
              return sp.getString(key, (String) defaultObject);
          } else if (defaultObject instanceof Integer) {
              return sp.getInt(key, (Integer) defaultObject);
          } else if (defaultObject instanceof Boolean) {
              return sp.getBoolean(key, (Boolean) defaultObject);
          } else if (defaultObject instanceof Float) {
              return sp.getFloat(key, (Float) defaultObject);
          } else if (defaultObject instanceof Long) {
              return sp.getLong(key, (Long) defaultObject);
          } else {
              return null;
          }
      }
  
      /**
       * 移除某个key值已经对应的值
       */
      public static void removeSP(Context context, String key) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
          SharedPreferences.Editor editor = sp.edit();
          editor.remove(key);
          SharedPreferencesCompat.apply(editor);
      }
  
      /**
       * 清除所有数据
       */
      public static void clearAllSP(Context context) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
          SharedPreferences.Editor editor = sp.edit();
          editor.clear();
          SharedPreferencesCompat.apply(editor);
      }
  
      /**
       * 查询某个key是否已经存在
       */
      public static boolean contains(Context context, String key) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
          return sp.contains(key);
      }
  
      /**
       * 返回所有的键值对
       */
      public static Map<String, ?> getAllKeyValue(Context context) {
          SharedPreferences sp = context.getSharedPreferences(getSpName(context), Context.MODE_PRIVATE);
          return sp.getAll();
      }
  
      /**
       * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
       *
       * @author zhouyou
       */
      private static class SharedPreferencesCompat {
  
          private static final Method sApplyMethod = findApplyMethod();
  
          /**
           * 反射查找apply的方法
           */
          @SuppressWarnings({"unchecked", "rawtypes"})
          private static Method findApplyMethod() {
              try {
                  Class clz = SharedPreferences.Editor.class;
                  return clz.getMethod("apply");
              } catch (NoSuchMethodException e) {
                  e.printStackTrace();
              }
  
              return null;
          }
  
          /**
           * 如果找到则使用apply执行，否则使用commit
           */
          public static void apply(SharedPreferences.Editor editor) {
              try {
                  if (sApplyMethod != null) {
                      sApplyMethod.invoke(editor);
                      return;
                  }
              } catch (IllegalArgumentException expected) {
                  expected.printStackTrace();
              } catch (IllegalAccessException expected) {
                  expected.printStackTrace();
              } catch (InvocationTargetException expected) {
                  expected.printStackTrace();
              }
              editor.commit();
          }
      }
  
      /**
       * 设置默认帐薄 id
       */
      public static void setDefBookBid(Long bid){
          setSP(UiUtils.getContext(), AppConstants.KEY_BID, bid);
      }
  
      /**
       * 获取默认帐薄 id
       */
      public static Long getDefBookBid(){
          return (Long) getSP(UiUtils.getContext(), AppConstants.KEY_BID, 0l);
      }
  }
  