文档章节

简单适用的SharedPreferences 工具类

最咸的咸鱼
 最咸的咸鱼
发布于 2017/07/06 23:45
字数 674
阅读 19
收藏 0
package net.nicolas.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

public final class SPUtils {
   
   private final static String name = "config";
   private final static int mode = Context.MODE_PRIVATE;
   
   /**
    * 保存首选项
    * @param context
    * @param key
    * @param value
    */
   public static void saveBoolean(Context context,String key,boolean value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putBoolean(key, value);
      edit.commit();
   }
   public static void saveInt(Context context,String key,int value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putInt(key, value);
      edit.commit();
   }
   public static void saveString(Context context,String key,String value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putString(key, value);
      edit.commit();
   }
   
   
   /**
    * 获取首选项
    * @param context
    * @param key
    * @param defValue
    * @return
    */
   public static boolean getBoolean(Context context,String key,boolean defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getBoolean(key, defValue);
   }
   
   public static int getInt(Context context,String key,int defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getInt(key, defValue);
   }
   
   public static String getString(Context context,String key,String defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getString(key, defValue);
   }
   /**
    * desc:将数组转为16进制
    *
    * @param bArray
    * @return modified:
    */
   private static String bytesToHexString(byte[] bArray) {
      if (bArray == null) {
         return null;
      }
      if (bArray.length == 0) {
         return "";
      }
      StringBuffer sb = new StringBuffer(bArray.length);
      String sTemp;
      for (int i = 0; i < bArray.length; i++) {
         sTemp = Integer.toHexString(0xFF & bArray[i]);
         if (sTemp.length() < 2)
            sb.append(0);
         sb.append(sTemp.toUpperCase());
      }
      return sb.toString();
   }
   /**
    * desc:保存对象
    *
    * @param context
    * @param key
    * @param obj
    *            要保存的对象,只能保存实现了serializable的对象 modified:
    */
   public static void saveObject(Context context, String key, Object obj) {
      try {
         // 保存对象
         SharedPreferences.Editor sharedata = context.getSharedPreferences("user", Context.MODE_PRIVATE).edit();
         // 先将序列化结果写到byte缓存中,其实就分配一个内存空间
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream os = new ObjectOutputStream(bos);
         // 将对象序列化写入byte缓存
         os.writeObject(obj);
         // 将序列化的数据转为16进制保存
         String bytesToHexString = bytesToHexString(bos.toByteArray());
         // 保存该16进制数组
         sharedata.putString(key, bytesToHexString);
         sharedata.commit();
      } catch (IOException e) {
         e.printStackTrace();
         //Log.e("", "保存obj失败");
      }
   }
   /**
    * desc:将16进制的数据转为数组
    *
    * @param data
    * @return modified:
    */
   private static byte[] StringToBytes(String data) {
      String hexString = data.toUpperCase().trim();
      if (hexString.length() % 2 != 0) {
         return null;
      }
      byte[] retData = new byte[hexString.length() / 2];
      for (int i = 0; i < hexString.length(); i++) {
         int int_ch; // 两位16进制数转化后的10进制数
         char hex_char1 = hexString.charAt(i); // 两位16进制数中的第一位(高位*16)
         int int_ch1;
         if (hex_char1 >= '0' && hex_char1 <= '9')
            int_ch1 = (hex_char1 - 48) * 16; // // 0 的Ascll - 48
         else if (hex_char1 >= 'A' && hex_char1 <= 'F')
            int_ch1 = (hex_char1 - 55) * 16; // // A 的Ascll - 65
         else
            return null;
         i++;
         char hex_char2 = hexString.charAt(i); // /两位16进制数中的第二位(低位)
         int int_ch2;
         if (hex_char2 >= '0' && hex_char2 <= '9')
            int_ch2 = (hex_char2 - 48); // // 0 的Ascll - 48
         else if (hex_char2 >= 'A' && hex_char2 <= 'F')
            int_ch2 = hex_char2 - 55; // // A 的Ascll - 65
         else
            return null;
         int_ch = int_ch1 + int_ch2;
         retData[i / 2] = (byte) int_ch;// 将转化后的数放入Byte里
      }
      return retData;
   }

   /**
    * desc:获取保存的Object对象
    *
    * @param context
    * @param key
    * @return modified:
    */
   public static Object getObject(Context context, String key) {
      try {
         SharedPreferences sharedata = context.getSharedPreferences("user", Context.MODE_PRIVATE);
         if (sharedata.contains(key)) {
            String string = sharedata.getString(key, "");
            if (TextUtils.isEmpty(string)) {
               return null;
            } else {
               // 将16进制的数据转为数组,准备反序列化
               byte[] stringToBytes = StringToBytes(string);
               ByteArrayInputStream bis = new ByteArrayInputStream(stringToBytes);
               ObjectInputStream is = new ObjectInputStream(bis);
               // 返回反序列化得到的对象
               Object readObject = is.readObject();
               return readObject;
            }
         }
      } catch (StreamCorruptedException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
      // 所有异常返回null
      return null;
   }

}

© 著作权归作者所有

共有 人打赏支持
最咸的咸鱼
粉丝 1
博文 3
码字总数 2366
作品 0
武汉
程序员
[Android] SharedPreferences工具类

我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPreferences的使用也很简单,我自己就写了一...

枫兮兮
2014/02/27
0
0
SharePreference原理及跨进程数据共享的问题

SharedPreferences是Android提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问。为什么这么说呢?因为SharedPreferences的实现是基于单个xml文件实现的,并且,所有持久化数据...

看书的小蜗牛
2017/11/15
0
0
Android之SharedPreferences两个工具类

相信Android的这个最简单的存储方式大家都很熟悉了,但是有一个小小技巧,也许你没有用过,今天就跟大家分享一下,我们可以把SharedPreferences封装在一个工具类中,当我们需要写数据和读数据...

postdep
2014/11/27
0
0
Android_6.数据存储2_SharedPreferences存储

本文是以Android Studio为开发工具,<> 为学习指导书籍的学习记录 6.3 SharedPreferences存储 1、不同于文件的存储方式,SharedPreferences是使用“==键值对==“的方式来存储数据的。即、当你...

橄榄工作室
05/24
0
0
Android中SharedPreferences用法

1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences 保存...

ForingY
2016/07/22
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
14分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
21分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
24分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
29分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部