2011-08-24 49 views

回答

41

你可以嘗試這樣來做:

  • 把你的整數轉換成字符串,每劃定一個字符詮釋,例如一個逗號,然後將其保存爲一個字符串:

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

請注意,只有在數據量較小時才能使用此方法,因爲字符串操作效率不高。 (每個人物在閱讀時都需要解析)。 –

+1

根據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 –

0

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

14

你不能把數組中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; 
} 
+0

你忘了調用commit()。 –

+0

你是對的!更新它 –

5

這裏是我的版本的基礎上,葉戈爾的回答。我更喜歡不使用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; 
} 
3

兩個解決方案:

(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來包圍它。

+0

解決方案2是要走的路 – Cobbles

+0

第二個解決方案很好,但它會失去元素順序。 – blackwolf

+0

@blackwolf用'java.util.SortedSet'嘗試它 - 也許Android會正確地序列化它。 – Risadinha

1

我喜歡使用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。

0

這裏是如何的「轉換爲逗號分隔字符串」解決方案可以看看在科特林,作爲擴展函數來實現:

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) 
相關問題