昨天,下班在家想作什麼來着,而後想用
SharedPreferences
存點數據,可是不知道咋地忽然想到,SharedPreferences
是應用啓動時一次性加到內存裏的.適合少許的存儲,多的話仍是用數據庫吧.實際項目中都是數據庫,我私下寫寫demo就不搞那麼麻煩了=.=html而後,問題來了,若是我要使用
SharedPreferences
,如何在比較小的單位裏存儲更多的信息.java
好了,正題.android
android developer
官網!!!{=.=} 激動!!!git
你的書籤地址仍是 https://developer.android.com/index.html ???{大霧}github
國內速度更快!!!地址:https://developer.android.google.cn/index.html{快快加書籤!!!}數據庫
Markdown
編輯器,感受比我以前用的 MarkdownPad2
好用分享下,名字: Haroopadmarkdown
順便丟個本身的GitHub倉庫,收集了一些開發必須的工具,須要的能夠去看看,順便 watch fuck star...app
開發平常應該必備吧(今天發現的hosts不錯,YouTube也能夠看,已經提供了七牛雲下載) https://github.com/didikee/Dev_Tools編輯器
思路:ide
想起以前看源碼的時候谷歌用二進制存儲
boolean
值,而後我想了想,貌似能夠用String
存一些值.例如:"10101101": 能夠解讀爲:
true false true false true true false true
可是,"1"也是一個字符,它不限於"1",也能夠是2或3甚至*或者%等等字符就能夠.
1. 定義 Value:
Value:是一些char
類型的值,表明一些含義.我簡單的定義了四種:
public abstract class SPValue { public static final char TRUE='1';//true public static final char FALSE='0';//false public static final char DEFAULT='-';//默認的時候會是'-' public static final char ERROR='=';//發生錯誤的時候可能會用'=' }
2. 定義 Key:
Key:是由 0 ~ Integer.MaxValue() ,其實就是String
的腳標index
.
public abstract class SPKey { //抽象類,給子類繼承 }
3. 提供 get 和 put 功能
定義功能接口:
public interface ISPDao { char getValue(int key); void putValue(int key,char value); }
最後是實現類:
public final class SPDao implements ISPDao { private final Context context; public static final String SPDAO = "spDao"; public static final String SPKEY = "spKey"; public SPDao(Context context) { this.context = context; } @Override public char getValue(int key) { SharedPreferences sp = context.getSharedPreferences(SPDAO, Context.MODE_PRIVATE); String allValues = sp.getString(SPKEY, ""); Log.e("test","get: "+allValues); String defaultStr = String.valueOf(SPValue.DEFAULT); int maxIndex = allValues.length() - 1; if (key > maxIndex) { SharedPreferences.Editor editor = sp.edit(); String tempAdd = ""; for (int i = maxIndex + 1; i <= key; i++) { tempAdd += defaultStr; } editor.putString(SPKEY, allValues + tempAdd); editor.apply(); return SPValue.DEFAULT; } else { return allValues.charAt(key); } } @Override public void putValue(int key, char value) { SharedPreferences sp = context.getSharedPreferences(SPDAO, Context.MODE_PRIVATE); String allValues = sp.getString(SPKEY, ""); Log.e("test","put start: "+allValues); String defaultStr = String.valueOf(SPValue.DEFAULT); SharedPreferences.Editor editor = sp.edit(); int maxIndex = allValues.length() - 1; if (key > maxIndex) { String tempAdd = ""; for (int i = maxIndex + 1; i <= key; i++) { tempAdd += defaultStr; } Log.e("test","put end1: "+allValues+ tempAdd); editor.putString(SPKEY, allValues+tempAdd); } else { char oldChar = allValues.charAt(key); Log.e("test","oldCar: "+oldChar); StringBuilder sb=new StringBuilder(allValues); sb.setCharAt(key,value); Log.e("test","put end2: "+ sb.toString()); editor.putString(SPKEY, sb.toString()); } editor.apply(); } }
說明:中間的if做用是,若是你要獲取腳標 4 的char值,可是目前String長度只有 3 ,那麼我就填充String 到index 4,填充的值"DEFAULT"
值.同理,我在put的時候也會作這樣的處理.
最後就是Key的值實際上是0開始,建議是連續的,由於不是連續的話,那麼必然會有一些index的佔位是無心義的,至於我最開始的思路是相違背的.
4.最後提供一個檢測 key 是否重複定義的工具類
思路: 用反射獲得全部的定義的key,而後比較是否重複,重複的話意味着同一個腳標index同時表明了兩種含義,這是不被容許的.
代碼:
public class SPDaoChecker { private static final String CHANGE="$change"; private static final String SERIAL_VERSION_UID="serialVersionUID"; /** * check your SPKeys * @param clz class extend SPKey * @return */ public static boolean check(Class clz){ ArrayList<Integer> charList=new ArrayList(); Field[] fields = clz.getFields(); for (Field field : fields) { String name = field.getName(); if (SERIAL_VERSION_UID.equalsIgnoreCase(name) || CHANGE.equalsIgnoreCase(name)){ continue; } boolean accessible = field.isAccessible(); if (!accessible)field.setAccessible(true); int value= -1; try { value = field.getInt(clz.newInstance()); } catch (Exception e){ Log.d("test","e: "+e.getClass().getSimpleName()+"msg: "+e.getMessage()); return false; } if (charList.contains(value)){ return false; }else { charList.add(value); } Log.d("test","name: "+name+"value: "+value); } return true; } }
好了,差很少說完了,有什麼不對的地方輕拍,你也不會打個人對不對?嘿嘿