Android通過反射打造可以儲存任何對象的萬能SharedPreferences

來源:互聯網
上載者:User

標籤:

我們通常使用SharedPreferences儲存一些需要儲存在本地,但又不至於儲存在資料庫裡的一些資料,一般我們用它來儲存一些使用者名稱,密碼等資料是非常方便的,那麼如果我們想要儲存的資訊有10幾條,我們就得寫10幾行重複的代碼把他們存進去,取出來的時候還得寫10幾行代碼將他們一條一條取出來,那麼有沒有什麼辦法可以只需要一行代碼就可以將他們存進去,一行代碼就將他們取出來?答案是有的,這篇文章我們就介紹如何通過反射來實現。

1.將我們想要儲存的資料封裝成一個實體類 Person.java 其中屬性我們都用Public來修飾

public class Person {    //String類型屬性 姓名    public String name;    //int類型屬性 年齡    public int age;    //float類型屬性 身高    public float height;    //boolean類型屬性 是否已婚    public boolean isMarried;    //String類型屬性 證件號    public String id;}

2.通過反射,將Person類中的屬性取出來

public class SharedPreferencesUtils {    /**     * 根據傳入的對象,取出其中用public修飾符修飾的屬性     * @param clazz 想要拿到屬性的類的位元組碼檔案     * @return 所有用pulic修飾的屬性的一個list表     */    public static <T> List<Field> getPublicFields(Class<?> clazz){        if (clazz.equals(Object.class)) {            return null;        }        //用來儲存clazz中用public修飾的屬性的list        List<Field> list = new ArrayList<Field>();        //獲得clazz中所有用public修飾的屬性        Field[] fields = clazz.getFields();        //將fields加入到list中        for(int i=0 ; i<fields.length ; i++){            list.add(fields[i]);        }        return list;    }

我們先來測試一下屬性有沒有被取出來,我們在MainActivity.java中添加如下代碼進行測試

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //調用我們剛剛寫好的方法來擷取Person類中的屬性        List<Field> publicFields = SharedPreferencesUtils.getPublicFields(Person.class);        for(Field f : publicFields){            String name = f.getName();            Log.i("TAG", name+"\n");        }    }}
我們來看一下Log列印的資訊我們可以看到,Person中的屬性我們都已經拿到了  3.將Object Storage Service到SharedPreferences中
public static void putObjectToShare(String shareName , Object obj){        //獲得SharedPreferences執行個體        SharedPreferences sharedPreferences = mContext.getSharedPreferences(shareName,Activity.MODE_PRIVATE);        //獲得Editor        Editor edit = sharedPreferences.edit();        //儲存資料之前先將之前的舊資料清掉        edit.clear();        //調用commit提交資料(這裡為了清掉資料)        edit.commit();                List<Field> publicFields = getPublicFields(obj.getClass());        for(Field f : publicFields){            String name = f.getName();            try {                //獲得當前屬性的類型和值                //類型的話如果是基本類型,會自動裝箱                Object type = f.get(obj);                //判斷各種類型,調用各種類型的put方法將資料存放區進去                if (type instanceof String) {                    edit.putString(name, (String) type);                }else if (type instanceof Integer) {                    edit.putInt(name, (Integer) type);                }else if (type instanceof Float) {                    edit.putFloat(name, (Float) type);                }else if (type instanceof Long) {                    edit.putLong(name, (Long) type);                }else if (type instanceof Boolean) {                    edit.putBoolean(name, (Boolean) type);                }            } catch (Exception e) {                e.printStackTrace();            }            //調用commit,提交資料            edit.commit();        }    }

5.我們來測試一下,修改MainAcitvity.java中的代碼

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //執行個體化一個Person執行個體,這是我們想要儲存到SharedPreferences中的對象        Person p = new Person("zhangsan",23,175.0f,false,"001");        //將p儲存到SharedPreferences的“zhangqi”名下        SharedPreferencesUtils.getInstance(this).putObjectToShare("zhangqi",p);;        //從SharedPreferences的“zhangqi”名下取出之前儲存過的Person執行個體        Person savedPerson = SharedPreferencesUtils.getInstance(this).getObjectFromShare("zhangqi",Person.class);        Log.e("zhangqi",""+savedPerson.toString());    }}
我們看一下Log中列印的savedPerson的資訊

Android通過反射打造可以儲存任何對象的萬能SharedPreferences

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.