返回介绍

4.1 SharePreferences 存储复杂对象的解决案例

发布于 2024-12-23 21:33:35 字数 3060 浏览 0 评论 0 收藏 0

这个案例完全有些多余(因为看完这个例子你会发现还不如使用 github 上大神流行的 ACache 更爽呢!),但是也比较有意思,所以还是拿出来说说,其实网上实现的也很多。

我们有时候可能会涉及到存储一个自定义对象到 SharedPreferences 中,这个怎么实现呢?标准的 SharedPreferences 的 Editor 只提供几个常见类型的 put 方法呀,其实可以实现的,原理就是 Base64 转码为字符串存储,如下给出我的一个工具类,在项目中可以直接使用:

/**
 * @author 工匠若水
 * @version 1.0
 * http://blog.csdn.net/yanbober
 * 保存任意类型对象到 SharedPreferences 工具类
 */
public final class ObjectSharedPreferences {
  private Context mContext;
  private String mName;
  private int mMode;

  public ObjectSharedPreferences(Context context, String name) {
    this(context, name, Context.MODE_PRIVATE);
  }

  public ObjectSharedPreferences(Context context, String name, int mode) {
    this.mContext = context;
    this.mName = name;
    this.mMode = mode;
  }

  /**
   * 保存任意 object 对象到 SharedPreferences
   * @param key
   * @param object
   */
  public void setObject(String key, Object object) {
    SharedPreferences preferences = mContext.getSharedPreferences(mName, mMode);

    ObjectOutputStream objOutputStream = null;
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
      objOutputStream = new ObjectOutputStream(outputStream);
      objOutputStream.writeObject(object);
      String objectVal = new String(Base64.encode(outputStream.toByteArray(), Base64.DEFAULT));
      SharedPreferences.Editor editor = preferences.edit();
      editor.putString(key, objectVal);
      editor.commit();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (outputStream != null) {
          outputStream.close();
        }
        if (objOutputStream != null) {
          objOutputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 从 SharedPreferences 获取任意 object 对象
   * @param key
   * @param clazz
   * @return
   */
  public <T> T getObject(String key, Class<T> clazz) {
    SharedPreferences preferences = this.mContext.getSharedPreferences(mName, mMode);
    if (preferences.contains(key)) {
      String objectVal = preferences.getString(key, null);
      byte[] buffer = Base64.decode(objectVal, Base64.DEFAULT);
      ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);
      ObjectInputStream objInputStream = null;
      try {
        objInputStream = new ObjectInputStream(inputStream);
        return (T) objInputStream.readObject();
      } catch (StreamCorruptedException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } finally {
        try {
          if (inputStream != null) {
            inputStream.close();
          }
          if (objInputStream != null) {
            objInputStream.close();
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return null;
  }
}

好了,没啥解释的,依据需求自己决定吧,这只是一种方案而已,其替代方案很多。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文