一個Android平臺上基于SharePreferences的偏好存儲庫:Treasure
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配置。