我想使用SharedPreferences保存/調用整數數組,這可能嗎?如何在SharedPreferences中存儲整數數組?
回答
你可以嘗試這樣來做:
把你的整數轉換成字符串,每劃定一個字符詮釋,例如一個逗號,然後將其保存爲一個字符串:
SharedPreferences prefs = getPreferences(MODE_PRIVATE); int[] list = new int[10]; StringBuilder str = new StringBuilder(); for (int i = 0; i < list.length; i++) { str.append(list[i]).append(","); } prefs.edit().putString("string", str.toString());
獲得信特林和使用的StringTokenizer解析它:
String savedString = prefs.getString("string", ""); StringTokenizer st = new StringTokenizer(savedString, ","); int[] savedList = new int[10]; for (int i = 0; i < 10; i++) { savedList[i] = Integer.parseInt(st.nextToken()); }
您只能保存原始值sharedPreference
。改爲使用Sqlite
。
你不能把數組中sharedPrefs,但可以解決方法:
public void storeIntArray(String name, int[] array){
SharedPreferences.Editor edit= mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE).edit();
edit.putInt("Count_" + name, array.length);
int count = 0;
for (int i: array){
edit.putInt("IntValue_" + name + count++, i);
}
edit.commit();
}
public int[] getFromPrefs(String name){
int[] ret;
SharedPreferences prefs = mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE);
int count = prefs.getInt("Count_" + name, 0);
ret = new int[count];
for (int i = 0; i < count; i++){
ret[i] = prefs.getInt("IntValue_"+ name + i, i);
}
return ret;
}
你忘了調用commit()。 –
你是對的!更新它 –
這裏是我的版本的基礎上,葉戈爾的回答。我更喜歡不使用StringBuilder,除非我構建了一個豐富的字符串,但是感謝Egor使用StringTokenizer - 過去沒有太多的使用它,但它非常方便!僅供參考,這便在我的實用工具類:
public static void saveIntListPrefs(
String name, Activity activity, List<Integer> list)
{
String s = "";
for (Integer i : list) {
s += i + ",";
}
Editor editor = activity.getPreferences(Context.MODE_PRIVATE).edit();
editor.putString(name, s);
editor.commit();
}
public static ArrayList<Integer> readIntArrayPrefs(String name, Activity activity)
{
SharedPreferences prefs = activity.getPreferences(Context.MODE_PRIVATE);
String s = prefs.getString(name, "");
StringTokenizer st = new StringTokenizer(s, ",");
ArrayList<Integer> result = new ArrayList<Integer>();
while (st.hasMoreTokens()) {
result.add(Integer.parseInt(st.nextToken()));
}
return result;
}
兩個解決方案:
(1)使用http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
它已經分裂/加入,讓你加入的功能,並在一個襯墊分割整數:
StringUtils.join([1, 2, 3], ';') = "1;2;3"
StringUtils.split("1;2;3", ';') = ["1", "2", "3"]
儘管如此,仍然必須將字符串轉換回整數。
事實上,分裂java.lang.String.split()
將工作一樣精細: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)
(2)使用SharedPreferences.putStringSet()(API 11):
SharedPreferences.Editor editor = preferences.edit();
int count = this.intSet.size();
if (count > 0) {
Set<String> theSet = new HashSet<String>();
for (Long l : this.intSet) {
theSet.add(String.valueOf(l));
}
editor.putStringSet(PREFS_KEY, theSet);
} else {
editor.remove(PREFS_KEY);
}
editor.commit();
而且把它找回來:
Set<String> theSet = this.preferences.getStringSet(PREFS_KEY, null);
if (theSet != null && !theSet.isEmpty()) {
this.intSet.clear();
for (String s : theSet) {
this.intSet.add(Integer.valueOf(s));
}
}
此代碼無法捕獲NPE或NumberFormatExceptions,因爲intSet會以其他方式保證爲否不包含任何空值。但是,當然,如果你不能保證在你的代碼中你應該用try/catch來包圍它。
我喜歡使用JSON,它可以作爲字符串存儲和檢索,以表示SharedPreferences中的任何複雜數據。 因此,在一個int陣列的情況下:
public void setPrefIntArray(String tag, int[] value)
{
SharedPreferences.Editor prefEditor = PreferenceManager.getDefaultSharedPreferences(context)
.edit();
String s;
try
{
JSONArray jsonArr = new JSONArray();
for (int i : value)
jsonArr.put(i);
JSONObject json = new JSONObject();
json.put(tag, jsonArr);
s = json.toString();
}
catch(JSONException excp)
{
s = "";
}
prefEditor.putString(tag, s);
prefEditor.commit();
}
public int[] getPrefIntArray(String tag, int[] defaultValue)
{
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
String s = pref.getString(tag, "");
try
{
JSONObject json = new JSONObject(new JSONTokener(s));
JSONArray jsonArr = json.getJSONArray(tag);
int[] result = new int[jsonArr.length()];
for (int i = 0; i < jsonArr.length(); i++)
result[i] = jsonArr.getInt(i);
return result;
}
catch(JSONException excp)
{
return defaultValue;
}
}
的妙處在於,同樣的想法可以應用於任何其它複雜的數據表示爲一個JSON。
這裏是如何的「轉換爲逗號分隔字符串」解決方案可以看看在科特林,作爲擴展函數來實現:
fun SharedPreferences.Editor.putIntArray(key: String, value: IntArray): SharedPreferences.Editor {
return putString(key, value.joinToString(
separator = ",",
transform = { it.toString() }))
}
fun SharedPreferences.getIntArray(key: String): IntArray {
with(getString(key, "")) {
with(if(isNotEmpty()) split(',') else return intArrayOf()) {
return IntArray(count(), { this[it].toInt() })
}
}
}
這樣,你可以使用putIntArray(String, IntArray)
和getIntArray(String)
就像其他PUT和設置方法:
val prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
prefs.edit().putIntArray(INT_ARRAY_TEST_KEY, intArrayOf(1, 2, 3)).apply()
val intArray = prefs.getIntArray(INT_ARRAY_TEST_KEY)
- 1. 如何在Android中的SharedPreferences中存儲整數數組?
- 2. 如何在SharedPreferences中存儲整數二維數組?
- 3. 在SharedPreferences中存儲字符串數組
- 4. 將數組存儲在sharedpreferences中
- 5. 如何在SharedPreferences中保存JSON數組?
- 6. 如何在android中從sharedpreferences存儲和檢索數組?
- 7. 在整數數組中存儲值
- 8. 在整數數組中存儲位圖
- 9. 在數組中存儲隨機整數
- 10. 如何在數組中存儲整數的每個數字
- 11. 整數如何存儲在內存中?
- 12. SharedPreferences是否存儲在數據庫中?
- 13. 存儲在sharedPreferences中
- 14. 如何在ListView中呈現存儲在SharedPreferences中的數據?
- 15. C如何打印存儲在char數組中的短整數?
- 16. 數組如何存儲在內存中?
- 17. 如何在SharedPreferences中存儲Date對象?
- 18. 如何在SharedPreferences中存儲一個int
- 19. 如何在SharedPreferences中存儲ArrayList
- 20. 如何在SharedPreferences中保存arrayList數據?
- 21. 如何使用SharedPreferences在Android中存儲數據
- 22. Python:如何在Google App Engine數據存儲中存儲數組
- 23. 如何存儲整數值到一個數組中的iphone
- 24. iPhone:如何使Obj-C中的整數數組和值存儲?
- 25. 在sharedPreferences中存儲Arraylist
- 26. 在sharedpreferences中存儲cookie
- 27. 在Android中存儲整數
- 28. 如何將整數值存儲在wp7的獨立存儲中?
- 29. angularjs - 如何在sessionStorage中存儲數組?
- 30. 如何在PHP中存儲PHP數組?
請注意,只有在數據量較小時才能使用此方法,因爲字符串操作效率不高。 (每個人物在閱讀時都需要解析)。 –
根據javadoc,不鼓勵使用StringTokenizer:http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html,而是使用String.split()。看到這裏http://stackoverflow.com/questions/6983856/why-is-stringtokenizer-deprecated –