实现通用的SharedPreferences访问接口

背景

在应用开发过程中,经常会用SharedPreferences存储配置参数、登陆状态等数据。直接使用系统提供的接口虽然能达到目的,但代码太啰嗦。本文目的是要实现一个优雅的SharedPreferences访问接口

目标

  1. 实现一组简单易用的访问接口
  2. 支持类型:String, Boolean, boolean, Integer, int, Long, long, Double, double
  3. 可以通过注解方式配置double类型精度
  4. 可以通过注解方式配置key,可以是资源文件
  5. 可以通过注解方式配置默认值,可以是资源文件

设计

接口定义

public interface PreferenceStorage<T> {

    boolean isPersistence();

    void save(@NonNull T model);

    T load();

    void clear();

}

Key注解

优先级: resId > key > fieldName

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface Key {

    String name() default "";

    /**
     * default key from string resource
     *
     * @return R.string.xxx
     */
    int resId() default 0;

}

默认值注解

优先级: resId > value > defaultValue

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface Default {

    String value() default "";

    /**
     * default value from string resource
     *
     * @return R.string.xxx
     */
    int resId() default 0;

}

非字符串字段会进行类型转换

精度注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface Precision {

    int scale() default 2;

    RoundingMode roundingMode() default RoundingMode.HALF_UP;

}

用法

定义数据模型

模型用于跟存储数据建立一对一的映射关系

public class DataModel {
    @Ignore
    private String ignored;
    private String field1;
    @Key("field_2")
    @Default(resId = R.string.hello)
    private String field2;
    @Precision
    @Default("1.23")
    private double field3;
    private Double field4;
    private Boolean field5;
    private boolean field6;
    private Integer field7;
    private int field8;
    private Long field9;
    private long field10;
}

定义访问类型

参考抽象类AbstractPreferenceStorage

用于存储和加载特定的数据类型

public class DataStore extends AbstractPreferenceStorage<DataModel> {
    public DataStore(Context context) {
        super(context, "data_model");
    }
}

建议使用Application Context

访问数据

// 存储
DataModel model1 = new DataModel();
new DataStore(context).save(model1);

// 加载
DataModel model2 = new DataStore(context).load();

// 清空
new DataStore(context).clear();

实现

参考源码

依赖

compile 'cn.wrh.android:easy-preference:1.0.0'

源码下载

https://github.com/hziee514/android-preference

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,480评论 2赞 89
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,142评论 6赞 13
  • 文/苟仙女 那一堆晶莹的 在阳光下 闪烁如虹 我把一抹疼痛从 我的梦里 抽离 有一条新绿在沟渠里生长 宛如 我的春...
    林云空阅读 174评论 0赞 5
  • 竹简的学习树之八十一 学习树的最后一个单元,我们该谈谈树上的果子了。 我们不贪心、不求全,能结出二十颗果子就知足了...
    唐小宫阅读 1,023评论 0赞 1
  • No 01. 常见的请假(ask for leave) -paid leave and unpaid leave ...
    Kimmy_Xiao阅读 611评论 0赞 0

友情链接更多精彩内容