一个Android平台上基于SharePreferences的偏好存储库:Treasure

jopen 10年前

Treasure是一个Android平台上基于SharePreferences的偏好存储库,只需要定义接口,无需编写实现。运行时0反射,不仅使用方便而且性能和原生写法几乎无差别。

使用方法

1、添加依赖

Gradle

compile 'com.baoyz.treasure:treasure:0.3.1' provided 'com.baoyz.treasure:treasure-compiler:0.3.1'
2、定义接口
@Preferences  public interface SimplePreferences {        String getUsername();        void setUsername(String username);    }

我们定义了一个interface,需要使用@Preferences注解进行声明。然后可以定义一系列的get、set方法,用于获取和设置值。方法名会作为存储的key,例如getUsername()和setUsername()的key就是username,也就是通过setUsername()设置的value可以通过getUsername()获取到,因为他们的key是一样的。

3、实例化
SimplePreferences preferences = Treasure.get(context, SimplePreferences.class);  preferences.setUsername("Hello Treasure!");  preferences.getUsername(); // return "Hello Treasure!"

通过Treasure.get()方法可以获取指定的Preferences对象,之后可以调用set方法设置值,通过对应的get方法获取值。

高级用法

多文件

可以为一个Preferences生成多个文件,例如多账号管理,不同账号有不同Preferences。

Treasure.get(context, SimplePreferences.class, "id_one"); Treasure.get(context, SimplePreferences.class, "id_two");

Treasure提供了一个重载的get方法,可以传入一个String类型的ID,不同ID返回的Preferences对象不同,保存的文件也不同。(感谢好基友zzz40500提出的建议)

默认值

@Default注解可以指定get方法的默认值。

@Default("Hello Treasure!") String getUsername();    @Default("false") boolean isLogin(); // default is 1 hour @Default("1000 * 60 * 60") long getTimeout();    @Default({"hello", "world", "!"}) Set<String> getStringSet();

如果没有指定@Default那么默认值见下表。

返回值类型 默认值
int 0
float 0f
long 0l
boolean false
String null
Set<String> null

提交类型

设置值的默认提交类型是edit().apply(),如果想使用edit().commit()有三种方式。

1、全局
@Preferences(edit = Preferences.Edit.COMMIT) public interface SimplePreferences

全局指定提交方式之后,所有的set方法都会以commit()方法提交数据。

2、注解指定方法
@Commit void setUsername(String username);

使用@Commit注解只对当前方法有效。

3、指定方法返回boolean
boolean setUsername(String username);

无论上面两种方式有没有设置,只要set方法的返回值是boolean,那么这个方法就会以commit()方法提交,并且返回commit()的结果。

移除数据

@Remove void removeUsername();    @Remove void deleteTimeout();

使用@Remove注解修饰方法,调用方法移除对应key的数据。

清空数据

@Clear void clear();

可以声明一个方法,使用@Clear注解修饰,那么调用这个方法就会清空整个Preferences的数据。

关于方法名

如果方法名以get、set、put、is、remove、delete开头,那么会忽略这些前缀并且全部小写作为key,如果不包含这些前缀,那么方法名全部小写会作为key。

Proguard

Treasure运行时0反射,不需要添加Proguard配置。

项目主页:http://www.open-open.com/lib/view/home/1447744871681