SharedPreferences使用Set<String>的大坑

一、存儲集合數據,重新打開App后數據丟失的問題

(一)問題描述

有個歷史記錄的存本地的功能,使用Set<String>保存數據,然后獲取是對的,但是退出程序后重新進入,發現獲取的集合的元素和之前不一樣,比如說:保存的是A B C,獲取的是 A B C,但退出后重新進入獲取的集合是空的,數據怎么丟了呢?

(二)解決辦法

原來是SharedPreferences 這個類的原因,從SharedPreferences獲取的數據,我們操作這個數據,并不會真的改變SharedPreferences里存儲的原始數據,需要創建一個SharedPreferences 里面Set的副本。
原來的寫法:

historySet = SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory);

更改后寫法:

historySet =new LinkedHashSet<String>(SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory));

這樣數據就不會丟失了~

二、存儲集合數據,存儲前有序,讀取變無序

(一)問題描述

有個歷史記錄的存本地的功能,我使用的是LinkedHashSet <String>,元素嚴格按照放入順序排列,運行程序,保存數據,然后獲取是對的,順序也是對的,但是退出程序后重新進入,發現獲取的集合順序是錯的。比如說:保存的順序是 A B C,獲取的順序是 A B C,但退出后重新進入獲取的順序是 B C A,這是為什么?

(二)解決辦法

原來SharedPreferences在讀取配置xml文件時,碰到節點為“set”,即放入的stringSet對象,默認是生成一個HashSet對象進行保存的,即不管在保存的時候你是使用LinkedHashSet 、TreeSet還是HashSet,當你讀取的時候都是獲取到HashSet對象,讀取出來就變成了無序。

最后我還是使用了List轉成String存儲到SharedPreferences實現了這個功能,只能感嘆SharedPreferences有點坑~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。