全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android SharedPreferences存储的正确写法

SharedPreferences 特点

即便是Android小白都知道的SharedPreferences的用法,这是保存数据最简便的方法,但是不处理好的话后期维护将是一个巨大的坑。那么该如何处理好SharedPreferences才方便维护呢。先从它的特点开始入手吧。

  1. 通过Context.getSharedPreferences()获取的SharedPreferences是一个单例
  2. SharedPreferences.edit()每次都会创建一个新的编辑对象,commit()之前一切改动都无效

SharedPreferences的具体实现并不在公开API内,创建方法只有通过Context获取。具体实现我们不去研究,通过Log打印每次获取的对象都是同一个,同样的方法可知道每次edit()都会得到不同的对象。

难以维护的 SharedPreferences

SharedPreference userPreferences = context.getSharedPreferences("UserInfo", Context.MODE_PRIVATE);
userPreferences.edit()
  .putString("id", "myId")
  .putString("name", "myName")
  .putString("head", "myHead")
  .commit();
Log.e("id", userPreferences.getString("id",""));
Log.e("name", userPreferences.getString("name",""));
Log.e("head", userPreferences.getString("head",""));

如上一段SharedPreferences保存和读取的方法非常简便,正因此才不易维护,可能因为写错Key而找不出问题所在,当然一般我们都会把Key写成静态常量。但随着项目增大,可能需要多处修改用户信息,每次都要一个个put(), 除了写着厌烦看着难受,当遇到需要增加或减少字段时也非常不便。

SharedPreferences 该这么写

如果能保留原有写法,又能规范方法那是最好不过了,看下SharedPreferences的接口方法并不多,很容易就写个包装类封装下。

import android.content.SharedPreferences;
import android.support.annotation.Nullable;

import java.util.Map;
import java.util.Set;

/**
 * SharedPreferences 包装类
 * Created by wittytutu on 17-3-29.
 */

public class PreferencesWrapper implements SharedPreferences {

  protected SharedPreferences mPreferences;

  public PreferencesWrapper(SharedPreferences preferences) {
    mPreferences = preferences;
  }

  @Override
  public Map getAll() {
    return mPreferences.getAll();
  }

  @Nullable
  @Override
  public String getString(String key, @Nullable String defValue) {
    return mPreferences.getString(key, defValue);
  }

  @Nullable
  @Override
  public Set getStringSet(String key, @Nullable Set defValues) {
    return mPreferences.getStringSet(key, defValues);
  }

  @Override
  public int getInt(String key, int defValue) {
    return mPreferences.getInt(key, defValue);
  }

  @Override
  public long getLong(String key, long defValue) {
    return mPreferences.getLong(key, defValue);
  }

  @Override
  public float getFloat(String key, float defValue) {
    return mPreferences.getFloat(key, defValue);
  }

  @Override
  public boolean getBoolean(String key, boolean defValue) {
    return mPreferences.getBoolean(key, defValue);
  }

  @Override
  public boolean contains(String key) {
    return mPreferences.contains(key);
  }

  @Override
  public EditorWrapper edit() {
    return new EditorWrapper(mPreferences.edit());
  }

  @Override
  public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
    mPreferences.registerOnSharedPreferenceChangeListener(listener);
  }

  @Override
  public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
    mPreferences.unregisterOnSharedPreferenceChangeListener(listener);
  }

  public static class EditorWrapper implements Editor {
    protected Editor mEditor;

    public EditorWrapper(Editor editor) {
      mEditor = editor;
    }

    @Override
    public EditorWrapper putString(String key, @Nullable String value) {
      mEditor.putString(key, value);
      return this;
    }

    @Override
    public EditorWrapper putStringSet(String key, @Nullable Set values) {
      mEditor.putStringSet(key, values);
      return this;
    }

    @Override
    public EditorWrapper putInt(String key, int value) {
      mEditor.putInt(key, value);
      return this;
    }

    @Override
    public EditorWrapper putLong(String key, long value) {
      mEditor.putLong(key, value);
      return this;
    }

    @Override
    public EditorWrapper putFloat(String key, float value) {
      mEditor.putFloat(key, value);
      return this;
    }

    @Override
    public EditorWrapper putBoolean(String key, boolean value) {
      mEditor.putBoolean(key, value);
      return this;
    }

    @Override
    public EditorWrapper remove(String key) {
      mEditor.remove(key);
      return this;
    }

    @Override
    public EditorWrapper clear() {
      mEditor.clear();
      return this;
    }

    @Override
    public boolean commit() {
      return mEditor.commit();
    }

    @Override
    public void apply() {
      mEditor.apply();
    }
  }
}

接下来的使用就简单了

public class UserInfoPreferences extends PreferencesWrapper {
  private static final String NAME = "UserInfo";

  public static final KEY_ID = "id"
  public static final KEY_NAME = "name";
  public static final KEY_HEAD = "head";
  public static final KEY_SEX = "sex";

  private static volatile UserInfoPreferences mPreferences;

  public static UserInfoPreferences getInstance(Context context){
    if(mPreferences == null) {
      synchronized (UserInfoPreferences.class){
        if(mPreferences == null) {
          SharedPreferences preferences = context.getApplicationCtontext().getShaedPreferences(NAME, Context.MODE_PRIVATE);
          mPreferences = new UserInfoPreferences(preferences);
        }
      }
    }
    return mPreferences;
  }

  public UserInfoPreferences(SharedPreferences preferences) {
    super(preferences);
  }

  // 获取用户信息
  public UserInfo getUserInfo(){
    String id = mPreferences.getString(KEY_ID, "");
    String name = mPreferences.getString(KEY_NAME, "");
    String head = mPreferences.getString(KEY_HEAD, "");
    return new UserInfo(id, name, head);
  }

  @Override
  public Editor edit(){
    return new Editor(mPreferences.edit());
  }

  public static class Editor extends EditorWrapper {

    public Editor(SharedPreferences.Editor editor) {
      super(editor);
    }

    // 保存用户信息
    public Editor putUserInfo(String id, String name, String head) {

      mEditor.putString(KEY_ID, id)
          .putString(KEY_AME, name)
          .putString(KEY_HEAD, head);
      return this;
    }

    // 清空用户信息
    public Editor clearUserInfo() {

      mEditor.remove(KEY_ID)
          .remove(KEY_NAME)
          .remove(KEY_HEAD);
      return this;
    }
  }
}

调用即方便扩展,也保留了原有方法。

UserInfoPreferences preferences = UserInfoPreferences.getInstance(context);
preferences.edit()
  .clearUserInfo()
  .putUserInfo("myId", "myName", "myHead")
  .putInt(KEY_SEX, 0)
  .commit();
UserInfo userInfo = preferences.getUserInfo();
int sex = preferences.getInt(KEY_SEX, 0);

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # SharedPreferences  # SharedPreferences详解  # Android 使用 SharedPreferences 保存少量数据的实现代码  # Android数据共享 sharedPreferences 的使用方法  # Android中SharedPreferences简单使用实例  # Android本地存储SharedPreferences详解  # 详解Android中的SharedPreferences  # Android 文件存储与SharedPreferences存储方式详解用法  # 都是  # 是一个  # 这是  # 看着  # 那是  # 都要  # 不出  # 不去  # 很容易  # 希望能  # 将是  # 该如何  # 又能  # 写着  # 会把  # 谢谢大家  # 留了  # 创建一个  # 并不多  # 多处 


相关文章: 武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站之星logo尺寸如何设置最合适?  如何获取上海专业网站定制建站电话?  如何通过西部数码建站助手快速创建专业网站?  如何安全更换建站之星模板并保留数据?  ,柠檬视频怎样兑换vip?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  黑客如何通过漏洞一步步攻陷网站服务器?  网页设计与网站制作内容,怎样注册网站?  如何在万网主机上快速搭建网站?  招商网站制作流程,网站招商广告语?  宿州网站制作公司兴策,安徽省低保查询网站?  宁波免费建站如何选择可靠模板与平台?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何通过主机屋免费建站教程十分钟搭建网站?  建站之星在线客服如何快速接入解答?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  php json中文编码为null的解决办法  如何在宝塔面板创建新站点?  如何在Windows虚拟主机上快速搭建网站?  ,网站推广常用方法?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  建站VPS配置与SEO优化指南:关键词排名提升策略  小程序网站制作需要准备什么资料,如何制作小程序?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在阿里云购买域名并搭建网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  建站之星后台密码遗忘如何找回?  如何在阿里云部署织梦网站?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  定制建站策划方案_专业建站与网站建设方案一站式指南  如何选择适配移动端的WAP自助建站平台?  如何零基础开发自助建站系统?完整教程解析  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何基于云服务器快速搭建网站及云盘系统?  c++怎么用jemalloc c++替换默认内存分配器【性能】  活动邀请函制作网站有哪些,活动邀请函文案?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  Android自定义控件实现温度旋转按钮效果  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何快速完成中国万网建站详细流程?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何高效完成自助建站业务培训?  如何通过商城自助建站源码实现零基础高效建站?  制作网页的网站有哪些,电脑上怎么做网页?  中山网站制作网页,中山新生登记系统登记流程?  建站主机是否等同于虚拟主机?  如何通过VPS建站无需域名直接访问? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。