項目Github地址 https://github.com/NashLegend/AnyPrefgit
有時候在寫代碼的時候常常會有一些要持久保存某個對象的需求,這時候若是動用Sqlite又以爲過重,使用SharedPreferences保存的話確實是輕量級了,可是還要針對對象的每一個字段都要保存,可能要好多行代碼,讀取出來又是好多行代碼,咱們爲何不直接自動保存與讀取對象中的字段呢,若是有保存幾個不一樣對象的需求的話,那就能省下大量的代碼了。github
AnyPref是一個SharedPreferences工具類,它能夠直接保存某個對象到SharedPreferences中,使用方法:app
在工程根目錄build.gradle添加jitpack:maven
allprojects { repositories { maven { url "https://jitpack.io" } } }
在使用app/build.gradle中添加:ide
dependencies { compile 'com.github.NashLegend:AnyPref:1.2.1' }
AnyPref的基本原理是使用反射讀取字段名,並將類名做爲SharedPreferences的name,將字段名做爲SharedPreferences中的key保存字段,同時也支持經過註解來自定義SharedPreferences的name和key,默認它會將全部的SharedPreferences支持的public字段保存(static和final修飾的除外),也能夠經過註解來排除某些不須要的字段。若是要保存的對象中還包含了另外一個複雜子對象,好比Family類中有一個Son的字段,這時候Son對象默認是不會保存的,若是想同時保存這個子對象,須要添加PrefSub註解。同理若是要保存的對象中還包含一個ArrayList,要想保存這個ArrayList,須要添加PrefArrayList註解。工具
如何保存與讀取數據呢?gradle
在應用的Application的onCreate()
中添加以下代碼(主要是爲了省卻後面要傳入Context參數的麻煩)ui
AnyPref.init(this);
假設有一個Sample類。this
@PrefModel("prefName")//可不添加此註解,"prefName"表示保存SharedPreferences的name,可爲任意String字符串,若是不寫,則爲類的全名 public class Sample { @PrefField("intFieldKey")//可不添加此註解,"intFieldKey"表示保存此值時的key,可爲任意String字符串,若是不寫,則爲此變量的變量名 public int intField = 32; @PrefIgnore//添加此註解表示不保存這個變量 public float floatField = 1.2345f; @PrefField(numDef = 110)//表示若是讀取不到後使用的默認值 public long longField = 95789465213L; public String stringField = "string"; @PrefField(boolDef = true) public boolean boolField = false; @PrefField(value = "setValueWithSpecifiedKey", strDef = {"1", "2", "3", "4"})//默認值是[1,2,3,4] public Set<String> setValue = new LinkedHashSet<>(); @PrefSub(nullable = false)//nullable表示取子對象的時候,子對象是否能夠爲null,默認是true public SubSample son1;//標註了@PrefSub的變量,雖然不是SharedPreferences支持的類型,可是仍會被保存 @PrefArrayList(nullable = true, itemNullable = true)//nullable同上,itemNullable表示列表中的數據是否能夠爲null,默認爲true public ArrayList<SubSample> sampleArrayList;//標註了@PrefArrayList的ArrayList會被保存,可是ArrayList不能是基本類型的 }
保存數據:url
AnyPref.put(sample); //或者 AnyPref.put(sample, "your prefName");第二個參數是本身定義的保存此類的sharedPreferences name,不是PrefModel定義的那個name
讀取數據
Sample sample = AnyPref.get(Sample.class); //或者 Sample sample = AnyPref.get(Sample.class, "your prefName"); //或者 Sample sample = AnyPref.get(Sample.class, "your prefName", true);//第三個參數表示讀取出來的對象是否能夠爲null,默認不爲null
清除數據
AnyPref.clear(Sample.class); //或者 AnyPref.clear(Sample.class, "your prefName");
就是這麼簡單~
同時還有一些簡化操做SharedPreferences讀寫任意數據的方法:
AnyPref.getPrefs("sample") .putLong("long", 920394857382L) .putInt("int", 63) .putString("string", "sample string"); AnyPref.getPrefs(Sample.class) .beginTransaction() .putLong("long", 920394857382L) .putInt("int", 63) .putString("string", "sample string") .commit(); SharedPrefs sharedPrefs = AnyPref.getPrefs("sample"); System.out.println(sharedPrefs.getInt("int", 0)); System.out.println(sharedPrefs.getLong("long", 0)); System.out.println(sharedPrefs.getString("string", ""));
項目Github地址 https://github.com/NashLegend/AnyPref