如何在SharedPreferences中存储整数数组?

我想使用SharedPreferences保存/调用一个整型数组,这可能吗?

你可以尝试这样做:

  • 把你的整数放入一个字符串中,用逗号分隔每个int,然后把它们保存为一个字符串:

    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()); } 

你不能把数组放在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; } 

这是我的版本,根据叶戈尔的答案。 我更喜欢不使用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 : java.lang.String.split() 。串)

(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或NumberFormatException异常,因为intSet可以确保不包含任何空值。 但是,当然,如果你不能保证在你的代码中你应该围绕这个try / catch。

您只能在sharedPreference保存原始值。 改用Sqlite

我喜欢使用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的复杂数据。

以下是“转换为逗号分隔字符串”解决方案如何在Kotlin中查找,实现为扩展功能:

 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() }) } } } 

这样,您可以像使用其他put和set方法一样使用putIntArray(String, IntArray)getIntArray(String)

 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)