標籤:
我們通常使用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