一、存儲(chǔ)集合數(shù)據(jù),重新打開App后數(shù)據(jù)丟失的問題
(一)問題描述
有個(gè)歷史記錄的存本地的功能,使用Set<String>保存數(shù)據(jù),然后獲取是對(duì)的,但是退出程序后重新進(jìn)入,發(fā)現(xiàn)獲取的集合的元素和之前不一樣,比如說:保存的是A B C,獲取的是 A B C,但退出后重新進(jìn)入獲取的集合是空的,數(shù)據(jù)怎么丟了呢?
(二)解決辦法
原來是SharedPreferences 這個(gè)類的原因,從SharedPreferences獲取的數(shù)據(jù),我們操作這個(gè)數(shù)據(jù),并不會(huì)真的改變SharedPreferences里存儲(chǔ)的原始數(shù)據(jù),需要?jiǎng)?chuàng)建一個(gè)SharedPreferences 里面Set的副本。
原來的寫法:
historySet = SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory);
更改后寫法:
historySet =new LinkedHashSet<String>(SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory));
這樣數(shù)據(jù)就不會(huì)丟失了~
二、存儲(chǔ)集合數(shù)據(jù),存儲(chǔ)前有序,讀取變無序
(一)問題描述
有個(gè)歷史記錄的存本地的功能,我使用的是LinkedHashSet <String>,元素嚴(yán)格按照放入順序排列,運(yùn)行程序,保存數(shù)據(jù),然后獲取是對(duì)的,順序也是對(duì)的,但是退出程序后重新進(jìn)入,發(fā)現(xiàn)獲取的集合順序是錯(cuò)的。比如說:保存的順序是 A B C,獲取的順序是 A B C,但退出后重新進(jìn)入獲取的順序是 B C A,這是為什么?
(二)解決辦法
原來SharedPreferences在讀取配置xml文件時(shí),碰到節(jié)點(diǎn)為“set”,即放入的stringSet對(duì)象,默認(rèn)是生成一個(gè)HashSet對(duì)象進(jìn)行保存的,即不管在保存的時(shí)候你是使用LinkedHashSet 、TreeSet還是HashSet,當(dāng)你讀取的時(shí)候都是獲取到HashSet對(duì)象,讀取出來就變成了無序。
最后我還是使用了List轉(zhuǎn)成String存儲(chǔ)到SharedPreferences實(shí)現(xiàn)了這個(gè)功能,只能感嘆SharedPreferences有點(diǎn)坑~