Как сохранить целочисленный массив в SharedPreferences?

Я хочу сохранить / вспомнить целочисленный массив, используя SharedPreferences, возможно ли это?

Solutions Collecting From Web of "Как сохранить целочисленный массив в 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(int[] array){ SharedPreferences.Editor edit= mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE).edit(); edit.putInt("Count", array.length); int count = 0; for (int i: array){ edit.putInt("IntValue_" + count++, i); } edit.commit(); } public int[] getFromPrefs(){ int[] ret; SharedPreferences prefs = mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE); int count = prefs.getInt("Count", 0); ret = new int[count]; for (int i = 0; i < count; i++){ ret[i] = prefs.getInt("IntValue_"+ i, i); } return ret; } 

Вот моя версия, основанная на ответе Егора. Я предпочитаю не использовать StringBuilder, если я не строю огромную строку, но благодаря Егору для использования StringTokenizer – не использовали это в прошлом, но это очень удобно! FYI, это пошло в мой класс Utility:

 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

Он имеет функции split / join, которые позволяют вам объединять и разбивать целые числа в одном слое:

 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.

Вы можете сохранять только примитивные значения в sharedPreference . Sqlite этого используйте Sqlite .