android 使用SharedPreferences保存对象
今天,簡單講講Android如何使用SharedPreferences保存對象。
記得之前寫過一遍博客關(guān)于android如何使用SharedPreferences保存List<String>類型的鏈表,但是最近需要做一個需求,保存一個對象或者是List<Object>,那么應(yīng)該怎么辦呢?在網(wǎng)上查找了資料,最終是解決了問題。這里記錄一下。
一.使用Gosn將對象轉(zhuǎn)成String后存入SharedPreferences
下面是我封裝改賬本(Book)的Bean:
package beans;/*** Created by Chase on 2017/5/3.*/public class BookBean {public String bookName;public int bookBgSrc;public BookBean(){}public BookBean(String bookName,int bookBgSrc){this.bookName = bookName;this.bookBgSrc =bookBgSrc;}public String getBookName(){return bookName;}public int getBookBgSrc(){return bookBgSrc;}public void setBookBgSrc(int bookBgSrc) {this.bookBgSrc = bookBgSrc;}public void setBookName(String bookName) {this.bookName = bookName;} }
下面編寫兩個方法用來存儲和讀取這個Bean:
public class SpUtils {private static SharedPreferences sp;/*** 4.存儲賬本bookBean的list*/public static void putBookBean(Context ctx, List<BookBean> bookList) {if (sp == null) {sp = ctx.getSharedPreferences("config", MODE_PRIVATE);}SharedPreferences.Editor editor = sp.edit();Gson gson = new Gson();String json = gson.toJson(bookList);editor.putString(ConstantValue.BOOK_BEAN, json);editor.commit();}}
這個需要導(dǎo)入Gosn jar包,并且實體類需要滿足gosn對于實體類的要求,具體的大家可以查找資料。
二.使用Base64將對象編碼成String后存入SharedPreferences
由于二進制數(shù)據(jù)經(jīng)過編碼后可以用SharedPreferences以字符串的形式存儲,所以保存對象也成為了可能,但是這個類必須是可序列化即implements Serializable(實際上Serializable接口是個空接口,只是為了標記該對象是被序列化的),然后可以通過ObjectOutputStream保存再轉(zhuǎn)為二進制存儲。
1、保存序列化的對象
/*** @param user*/public static void saveUser(Context context, String preferenceName,String key,User user) throws Exception {if(user instanceof Serializable) {SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceName, context.MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();ByteArrayOutputStream baos = new ByteArrayOutputStream();try {ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(user);//把對象寫到流里String temp = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));editor.putString(key, temp);editor.commit();} catch (IOException e) {e.printStackTrace();}}else {throw new Exception("User must implements Serializable");}}2、讀取序列化的對象
public static User getUser(Context context, String preferenceName,String key) {SharedPreferences sharedPreferences=context.getSharedPreferences(preferenceName,context.MODE_PRIVATE);String temp = sharedPreferences.getString(key, "");ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));User user = null;try {ObjectInputStream ois = new ObjectInputStream(bais);user = (User) ois.readObject();} catch (IOException e) {}catch(ClassNotFoundException e1) {}return user;}
當然Sharedpreferences也是可以存儲各種集合類的比如說List,都可以通過轉(zhuǎn)為ObjectOutputStream輸出流進而編碼存儲:
public static String listToString(List<?> list)throws IOException {// 實例化一個ByteArrayOutputStream對象,用來裝載壓縮后的字節(jié)文件。ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 然后將得到的字符數(shù)據(jù)裝載到ObjectOutputStreamObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);// writeObject 方法負責寫入特定類的對象的狀態(tài),以便相應(yīng)的 readObject 方法可以還原它objectOutputStream.writeObject(list);// 最后,用Base64.encode將字節(jié)文件轉(zhuǎn)換成Base64編碼保存在String中String listString = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));// 關(guān)閉objectOutputStreamobjectOutputStream.close();return listString;}@SuppressWarnings("unchecked")public static List<?> StringToList(String listString) throws StreamCorruptedException, IOException,ClassNotFoundException {byte[] mobileBytes = Base64.decode(listString.getBytes(),Base64.DEFAULT);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);List<?> WeatherList = (List<?>) objectInputStream.readObject();objectInputStream.close();return WeatherList;}
這個我自己測試過,是可以正常使用的,不過實體類需要實現(xiàn)Serializable接口,而且效率可能比較低,這個大家可以去網(wǎng)上查找資料。
三、關(guān)于Base64
public static void main(String[] args) { BASE64Encoder encoder = new BASE64Encoder(); String s = "Man"; String encoded = encoder.encode(s.getBytes()); System.out.println("ecoded Man " + encoded); s = "Mo"; String encoded = encoder.encode(s.getBytes()); System.out.println("ecoded Mo" + encoded);s = "c"; String encoded = encoder.encode(s.getBytes()); System.out.println("ecoded c" + encoded);}
Base64是一種基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法。由于2的6次方等于64,所以每6個比特為一個單元,對應(yīng)某個可打印字符。三個字節(jié)有24個比特,對應(yīng)于4個Base64單元,即3個字節(jié)可表示4個可打印字符。它可用來作為電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、0-9,這樣共有62個字符,此外兩個可打印符號在不同的系統(tǒng)中而不同。Base64是一種可逆的編碼方式。最常見的表現(xiàn)就是在于可以用Base64對圖片編碼變成流,反過來也可以把流轉(zhuǎn)為圖片,Base64常用于在通常處理文本數(shù)據(jù)的場合,表示、傳輸、存儲一些二進制數(shù)據(jù)。包括MIME的email、在XML中存儲復(fù)雜數(shù)據(jù)。
這是編碼后的數(shù)據(jù)是一個字符串,其中包含的字符為:A-Z、a-z、0-9、+、/共64個字符(其實是65個字符,而“=”是填充字符)。
當長度為3個字節(jié)的數(shù)據(jù)經(jīng)過Base64編碼后就變?yōu)?個字節(jié),比如
如果要編碼的字節(jié)數(shù)不能被3整除,最后會多出1個或2個字節(jié),那么可以使用下面的方法進行處理:先使用0字節(jié)值在末尾補足,使其能夠被3整除,然后再進行base64的編碼。在編碼后的base64文本后加上一個或兩個’=’號,代表補足的字節(jié)數(shù)。也就是說,當最后剩余一個八位字節(jié)(一個byte)時,最后一個6位的base64字節(jié)塊有四位是0值,最后附加上兩個等號;如果最后剩余兩個八位字節(jié)(2個byte)時,最后一個6位的base字節(jié)塊有兩位是0值,最后附加一個等號。 參考下表:
android 使用SharedPreferences保存對象就講完了。
就這么簡單。
總結(jié)
以上是生活随笔為你收集整理的android 使用SharedPreferences保存对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android TextView 的se
- 下一篇: android SharedPrefer