日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 使用SharedPreferences保存对象

發布時間:2024/4/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 使用SharedPreferences保存对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.







今天,簡單講講Android如何使用SharedPreferences保存對象。


記得之前寫過一遍博客關于android如何使用SharedPreferences保存List<String>類型的鏈表,但是最近需要做一個需求,保存一個對象或者是List<Object>,那么應該怎么辦呢?在網上查找了資料,最終是解決了問題。這里記錄一下。


一.使用Gosn將對象轉成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();}}


/*** 讀取賬本bookBean的list*/public static List<BookBean> getBookBean(Context ctx) {if (sp == null) {sp = ctx.getSharedPreferences("config", MODE_PRIVATE);}Gson gson = new Gson();String json = sp.getString(ConstantValue.BOOK_BEAN, null);Type type = new TypeToken<List<BookBean>>() {}.getType();List<BookBean> arrayList = gson.fromJson(json, type);return arrayList;}


這個需要導入Gosn jar包,并且實體類需要滿足gosn對于實體類的要求,具體的大家可以查找資料。


二.使用Base64將對象編碼成String后存入SharedPreferences

由于二進制數據經過編碼后可以用SharedPreferences以字符串的形式存儲,所以保存對象也成為了可能,但是這個類必須是可序列化即implements Serializable(實際上Serializable接口是個空接口,只是為了標記該對象是被序列化的),然后可以通過ObjectOutputStream保存再轉為二進制存儲


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,都可以通過轉為ObjectOutputStream輸出流進而編碼存儲

public static String listToString(List<?> list)throws IOException {// 實例化一個ByteArrayOutputStream對象,用來裝載壓縮后的字節文件。ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 然后將得到的字符數據裝載到ObjectOutputStreamObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);// writeObject 方法負責寫入特定類的對象的狀態,以便相應的 readObject 方法可以還原它objectOutputStream.writeObject(list);// 最后,用Base64.encode將字節文件轉換成Base64編碼保存在String中String listString = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));// 關閉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;}


這個我自己測試過,是可以正常使用的,不過實體類需要實現Serializable接口,而且效率可能比較低,這個大家可以去網上查找資料。



三、關于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個可打印字符來表示二進制數據的表示方法。由于2的6次方等于64,所以每6個比特為一個單元,對應某個可打印字符。三個字節有24個比特,對應于4個Base64單元,即3個字節可表示4個可打印字符。它可用來作為電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Za-z0-9,這樣共有62個字符,此外兩個可打印符號在不同的系統中而不同。Base64是一種可逆的編碼方式。最常見的表現就是在于可以用Base64對圖片編碼變成流,反過來也可以把流轉為圖片,Base64常用于在通常處理文本數據的場合,表示、傳輸、存儲一些二進制數據。包括MIME的email、在XML中存儲復雜數據。
這是編碼后的數據是一個字符串,其中包含的字符為:A-Za-z0-9+/共64個字符(其實是65個字符,而“=”是填充字符)。

當長度為3個字節的數據經過Base64編碼后就變為4個字節,比如

如果要編碼的字節數不能被3整除,最后會多出1個或2個字節,那么可以使用下面的方法進行處理:先使用0字節值在末尾補足,使其能夠被3整除,然后再進行base64的編碼。在編碼后的base64文本后加上一個或兩個’=’號,代表補足的字節數。也就是說,當最后剩余一個八位字節(一個byte)時,最后一個6位的base64字節塊有四位是0值,最后附加上兩個等號;如果最后剩余兩個八位字節(2個byte)時,最后一個6位的base字節塊有兩位是0值,最后附加一個等號。 參考下表:


android 使用SharedPreferences保存對象就講完了。


就這么簡單。



總結

以上是生活随笔為你收集整理的android 使用SharedPreferences保存对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩中文字幕不卡 | 久久调教视频 | 人人玩人人干 | 最好看的2019年中文在线观看 | 欧美人与性禽动交精品 | 久久久久久久综合色一本 | 黄色网址免费 | 国产高清在线免费 | 国产精品久久久久久久久久久久久 | 四虎成人精品在永久免费 | 九九精品视频免费 | 亚洲国产三级 | a级无遮挡超级高清-在线观看 | 午夜久久网 | www国产com | 我要看18毛片| 操欧美老逼 | 亚洲第一二区 | 国产视频一区二区三区四区五区 | 国内精品卡一卡二卡三 | 国产精品无码久久久久成人app | 欧美少妇18p | 久久国产精品影视 | 国产成人精品一区二区色戒 | 欧美丰满少妇 | av体验区 | 91激情网| 日本中文字幕在线播放 | 91亚洲精品视频 | 91在线中文字幕 | 亚洲福利视频网 | 日本三级日本三级日本三级极 | 天天爱av| 亚洲一区| 91精品国产闺蜜国产在线闺蜜 | 91播放在线 | 亚洲精品四区 | 国产白浆视频 | 国产尤物视频在线观看 | 先锋影音男人 | 久久99精品国产.久久久久久 | 色屁屁影院www国产高清麻豆 | 少妇4p| 欧美色插 | 久久久剧场 | 最近2018年手机中文字幕版 | 色欲色香天天天综合网www | 天天干夜夜操视频 | 午夜日韩在线 | 国产主播专区 | 精品国产免费视频 | 国产123在线 | 欧美激情福利 | 色呦呦在线观看视频 | 亚洲精品污| 老司机午夜精品视频 | 人妻奶水人妻系列 | 蜜桃av在线看 | 国产欧美一区二区三区在线看蜜臀 | 久久超碰在线 | 亚洲精品一区在线观看 | 黄色一级在线播放 | 伊人最新网址 | 亚洲黄色片子 | 另类一区二区三区 | 日韩va在线| 1级黄色大片儿 | 成人在线观看免费 | 亚洲伦理精品 | 久久亚洲精少妇毛片午夜无码 | 青青青免费视频观看在线 | 免费a大片| 国产精品免费一区二区三区 | 国产真人做爰视频免费 | 午夜视频福利在线观看 | 免费看欧美片 | 成人午夜影视 | 中国老头性行为xxxx | 原神淫辱系列同人h | 开心激情播播网 | 国产精品久久久久久久久免费 | 成人免费aaa| 日日插夜夜爽 | 东北少妇不戴套对白第一次 | 337p粉嫩大胆色噜噜狠狠图片 | 激情午夜网 | 欧美三日本三级少妇三99 | 天天色天天综合 | 67194国产| 国产成人自拍网站 | 日韩av片在线免费观看 | 中文字幕亚洲精品在线观看 | 97人人模人人爽人人少妇 | 成人片在线免费看 | 老司机午夜免费福利 | 亚洲精品一区二区三区蜜桃久 | 成人公开免费视频 | 国产av一区二区三区精品 | 色偷偷人人澡人人爽人人模 |