Android SharedPreferences保存和读取对象

SharedPreferences保存和读取对象

1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码)

public class LoginResult extends BaseResult implements Serializable{

	private static final long serialVersionUID = 1L;

	private String mobiletoken;

2.保存和读取对象的封装

public class ObjectSaveUtil {

	private final static String FILENAME = "login_data_save";

	private final static String KEY = "loginResult";

	  /**
	   * desc:保存对象
	   * @param context
	   * @param key
	   * @param obj 要保存的对象,仅仅能保存实现了serializable的对象
	   * modified:
	   */
	  public static void saveObject(Context context,Object obj){
	      try {
	          // 保存对象
	          SharedPreferences.Editor sharedata = context.getSharedPreferences(FILENAME, 0).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 bArray
	   * @return
	   * modified:
	   */
	  public 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:获取保存的Object对象
	   * @param context
	   * @param key
	   * @return
	   * modified:
	   */
	  public static Object readObject(Context context){
	      try {
	          SharedPreferences sharedata = context.getSharedPreferences(FILENAME, 0);
	          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) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      } catch (IOException e) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      } catch (ClassNotFoundException e) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      }
	      //全部异常返回null
	      return null;

	  }
	  /**
	   * desc:将16进制的数据转为数组
	   * <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p>
	   * @param data
	   * @return
	   * modified:
	   */
	  public 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_ch3;
	          if(hex_char1 >= '0' && hex_char1 <='9')
	              int_ch3 = (hex_char1-48)*16;   //// 0 的Ascll - 48
	          else if(hex_char1 >= 'A' && hex_char1 <='F')
	              int_ch3 = (hex_char1-55)*16; //// A 的Ascll - 65
	          else
	              return null;
	          i++;
	          char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)
	          int int_ch4;
	          if(hex_char2 >= '0' && hex_char2 <='9')
	              int_ch4 = (hex_char2-48); //// 0 的Ascll - 48
	          else if(hex_char2 >= 'A' && hex_char2 <='F')
	              int_ch4 = hex_char2-55; //// A 的Ascll - 65
	          else
	              return null;
	          int_ch = int_ch3+int_ch4;
	          retData[i/2]=(byte) int_ch;//将转化后的数放入Byte里
	      }
	      return retData;
	}

}

挺好用的,欢迎大家复制使用

时间: 2024-08-05 14:57:14

Android SharedPreferences保存和读取对象的相关文章

iOS 保存、读取与应用状态

固化 对于大多数iOS应用,可以将其功能总结为:提供一套界面,帮助用户管理特定的数据.在这一过程中,不同类型的对象要各司其职:模型对象负责保存数据,视图对象负责显示数据,控制器对象负责在模型对象与视图对象之间同步数据.因此,当某个应用要保存和读取数据时,通常要完成的任务是保存和读取相应的模型对象. 对 JXHmoepwner 应用,用户可以管理的模型对象是 JXItem 对象.目前 JXHomepwner 不嗯给你保存 JXItem 对象,所以,当用户重新运行 JXHomepwner 时,之前创

Android使用SharedPreferences保存对象

核心原理: 对象序列化 步骤 1.要保存的对象实现序列化Serializable 2.将序列化的对象保存String(本文的做法是保存为byte数组在转为16进制的String类型保存起来) 3.将保存的String反序列化为对象 下面是完整代码 步骤1.要保存的对象实现序列化Serializable public class Sertest implements Serializable{ private String name; private int age; } 步骤2.将序列化的对象保

Android采用SharedPreferences方式进行文件的保存与读取

工程目录: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息.SharedPreferences正是Android中用于实现这中存储方式的技术. 下面直接贴实现代码: package peixun.savaparameter.service; PreferenceService类: <span style="

安卓实训第十天:利用SharedPreferences来实现数据的保存和读取,以及实现手机电话备份,XMLserializer

一.利用SharedPreferences来实现数据的保存和读取: 1.Mainactivity: package com.example.sharedpreferencesdemo; import com.example.sharedpreferencesdemo.util.SharedPreferencesUtil; import android.app.Activity; import android.app.AlertDialog; import android.content.Cont

android SharedPreferences简单应用 插入数据 读取数据

package com.sharedpreference; import java.text.SimpleDateFormat; import java.util.Date; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.view.Menu; import android.view.View; import androi

Android使用SharedPreferences保存账号密码

有很多的应用都会有保存密码和账号的功能,比如QQ.接下来就讲讲使用SharedPreferences来保存密码和账号,也许有些人会考虑的数据库,但是我个人认为对于保存简单的数据,使用的数据库就大材小用了,SharedPreferences比较轻量级 首先写好布局,只有两个输入框和一个按钮 <EditText android:id="@+id/number" android:layout_width="match_parent" android:layout_h

Android——文件的保存和读取

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件. Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件. MODE_WOR

Android之使用SharedPreferences保存用户偏好参数

在Android应用中,我们常需要记录用户设置的一些偏好参数,,此时我们就需要用SharedPreferences和Editor将这些信息保存下来,在下次登录时读取. SharedPreferences保存的数据主要类似于配置信息格式的数据,因此它保存数据的形式为key-value对,下面我们来看下实例代码. 首先是界面布局,比较简单,就是一个普通的登陆界面. 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/r

[MISS静IOS开发原创文摘]-AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象

由于app开发的需求,需要从api接口获得json格式数据并保存临时的 app的主题颜色 和 相关url 方案有很多种: 1, 通过AppDelegate保存为全局变量,再获取 2,使用NSUSerDefault 第一种 :通过AppDelegate方法: 定义全局变量 // // AppDelegate.h // // Created by MISSAJJ on 15/5/5. // Copyright (c) 2015年 MISSAJJ. All rights reserved. // #i