溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

AnyPref,可直接在SharedPreferences中保存對(duì)象實(shí)例的SharedPreferences工具類

發(fā)布時(shí)間:2020-06-27 19:27:12 來源:網(wǎng)絡(luò) 閱讀:1277 作者:NashLegend 欄目:移動(dòng)開發(fā)

項(xiàng)目Github地址 https://github.com/NashLegend/AnyPref


有時(shí)候在寫代碼的時(shí)候經(jīng)常會(huì)有一些要持久保存某個(gè)對(duì)象的需求,這時(shí)候如果動(dòng)用Sqlite又覺得太重,使用SharedPreferences保存的話確實(shí)是輕量級(jí)了,但是還要針對(duì)對(duì)象的每個(gè)字段都要保存,可能要好多行代碼,讀取出來又是好多行代碼,我們?yōu)槭裁床恢苯幼詣?dòng)保存與讀取對(duì)象中的字段呢,如果有保存幾個(gè)不同對(duì)象的需求的話,那就能省下大量的代碼了。


AnyPref是一個(gè)SharedPreferences工具類,它可以直接保存某個(gè)對(duì)象到SharedPreferences中,使用方法:


在工程根目錄build.gradle添加jitpack:


allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}


在使用app/build.gradle中添加:


dependencies {
    compile 'com.github.NashLegend:AnyPref:1.2.1'
}


AnyPref的基本原理是使用反射讀取字段名,并將類名作為SharedPreferences的name,將字段名作為SharedPreferences中的key保存字段,同時(shí)也支持通過注解來自定義SharedPreferences的name和key,默認(rèn)它會(huì)將所有的SharedPreferences支持的public字段保存(static和final修飾的除外),也可以通過注解來排除某些不需要的字段。如果要保存的對(duì)象中還包含了另一個(gè)復(fù)雜子對(duì)象,比如Family類中有一個(gè)Son的字段,這時(shí)候Son對(duì)象默認(rèn)是不會(huì)保存的,如果想同時(shí)保存這個(gè)子對(duì)象,需要添加PrefSub注解。同理如果要保存的對(duì)象中還包含一個(gè)ArrayList,要想保存這個(gè)ArrayList,需要添加PrefArrayList注解。


如何保存與讀取數(shù)據(jù)呢?


在應(yīng)用的Application的onCreate()中添加如下代碼(主要是為了省卻后面要傳入Context參數(shù)的麻煩)

    AnyPref.init(this);


假設(shè)有一個(gè)Sample類。


    @PrefModel("prefName")//可不添加此注解,"prefName"表示保存SharedPreferences的name,可為任意String字符串,如果不寫,則為類的全名
    public class Sample {
    
        @PrefField("intFieldKey")//可不添加此注解,"intFieldKey"表示保存此值時(shí)的key,可為任意String字符串,如果不寫,則為此變量的變量名
        public int intField = 32;
        
        @PrefIgnore//添加此注解表示不保存這個(gè)變量
        public float floatField = 1.2345f;
        
        @PrefField(numDef = 110)//表示如果讀取不到后使用的默認(rèn)值
        public long longField = 95789465213L;
        
        public String stringField = "string";
        
        @PrefField(boolDef = true)
        public boolean boolField = false;
        
        @PrefField(value = "setValueWithSpecifiedKey", strDef = {"1", "2", "3", "4"})//默認(rèn)值是[1,2,3,4]
        public Set<String> setValue = new LinkedHashSet<>(); 
        
        @PrefSub(nullable = false)//nullable表示取子對(duì)象的時(shí)候,子對(duì)象是否可以為null,默認(rèn)是true
        public SubSample son1;//標(biāo)注了@PrefSub的變量,雖然不是SharedPreferences支持的類型,但是仍會(huì)被保存
        
        @PrefArrayList(nullable = true, itemNullable = true)//nullable同上,itemNullable表示列表中的數(shù)據(jù)是否可以為null,默認(rèn)為true
        public ArrayList<SubSample> sampleArrayList;//標(biāo)注了@PrefArrayList的ArrayList會(huì)被保存,但是ArrayList不能是基本類型的
    }


保存數(shù)據(jù):


    AnyPref.put(sample);
    //或者
    AnyPref.put(sample, "your prefName");第二個(gè)參數(shù)是自己定義的保存此類的sharedPreferences name,不是PrefModel定義的那個(gè)name


讀取數(shù)據(jù)


    Sample sample = AnyPref.get(Sample.class);
    //或者
    Sample sample = AnyPref.get(Sample.class, "your prefName");
    //或者
    Sample sample = AnyPref.get(Sample.class, "your prefName", true);//第三個(gè)參數(shù)表示讀取出來的對(duì)象是否可以為null,默認(rèn)不為null


清除數(shù)據(jù)


    AnyPref.clear(Sample.class);
    //或者
    AnyPref.clear(Sample.class, "your prefName");


就是這么簡(jiǎn)單~


同時(shí)還有一些簡(jiǎn)化操作SharedPreferences讀寫任意數(shù)據(jù)的方法:


    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", ""));


項(xiàng)目Github地址 https://github.com/NashLegend/AnyPref




向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI