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

您不能将Arrays放在SharedPreferences中,但您可以解决方法:

 private static final String LEN_PREFIX = "Count_"; private static final String VAL_PREFIX = "IntValue_"; public void storeIntArray(String name, int[] array){ SharedPreferences.Editor edit= mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE).edit(); edit.putInt(LEN_PREFIX + name, array.length); int count = 0; for (int i: array){ edit.putInt(VAL_PREFIX + name + count++, i); } edit.commit(); } public int[] getFromPrefs(String name){ int[] ret; SharedPreferences prefs = mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE); int count = prefs.getInt(LEN_PREFIX + name, 0); ret = new int[count]; for (int i = 0; i < count; i++){ ret[i] = prefs.getInt(VAL_PREFIX+ name + i, i); } return ret; } 

这是我的版本,基于Egor的回答。 我不想使用StringBuilder,除非我正在构建一个令人兴奋的字符串,但感谢Egor使用StringTokenizer – 过去没有太多使用它,但它非常方便! 仅供参考,这是我的Utility类:

 public static void saveIntListPrefs( String name, Activity activity, List 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 readIntArrayPrefs(String name, Activity activity) { SharedPreferences prefs = activity.getPreferences(Context.MODE_PRIVATE); String s = prefs.getString(name, ""); StringTokenizer st = new StringTokenizer(s, ","); ArrayList result = new ArrayList(); 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

它具有分割/连接function,允许您在一个衬垫中连接和分割整数:

 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 theSet = new HashSet(); for (Long l : this.intSet) { theSet.add(String.valueOf(l)); } editor.putStringSet(PREFS_KEY, theSet); } else { editor.remove(PREFS_KEY); } editor.commit(); 

并把它拿回来:

  Set 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的复杂数据。

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

以下是“转换为逗号分隔字符串”解决方案在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() }) } } } 

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

 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)