2011-08-24 32 views

Trả lời

41

Bạn có thể thử làm theo cách này:

  • Đặt số nguyên của bạn vào một chuỗi, phân chia ranh giới mỗi int theo ký tự, ví dụ: dấu phẩy và sau đó lưu chúng dưới dạng chuỗi:

    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()); 
    
  • Tải xuống Tring và phân tích nó sử dụng 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

Lưu ý rằng phương pháp này chỉ có thể được sử dụng khi bạn có ít dữ liệu, vì các phép toán String không hiệu quả. (mọi ký tự cần được phân tích cú pháp khi đọc). –

+1

Theo javadoc, việc sử dụng StringTokenizer không được khuyến khích: http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html, sử dụng String.split() để thay thế. Xem tại đây http://stackoverflow.com/questions/6983856/why-is-stringtokenizer-deprecated –

0

Bạn chỉ có thể lưu giá trị nguyên thủy trong sharedPreference. Sử dụng Sqlite để thay thế.

14

bạn không thể đặt mảng trong sharedPrefs, nhưng bạn có thể workaround:

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

Bạn quên gọi cam kết(). –

+0

Bạn nói đúng! đã cập nhật nó –

5

Dưới đây là phiên bản của tôi, dựa trên câu trả lời của Egor. Tôi không muốn sử dụng StringBuilder trừ khi tôi đang xây dựng một chuỗi dữ dội, nhưng nhờ Egor sử dụng StringTokenizer - đã không sử dụng nhiều trong quá khứ, nhưng nó rất tiện dụng! FYI, điều này đi vào lớp Utility của tôi:

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

Hai giải pháp:

(1) Sử dụng http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

Nó đã chia/chức năng cho phép bạn tham gia tham gia và chia số nguyên trong một lớp lót:

StringUtils.join([1, 2, 3], ';') = "1;2;3" 
StringUtils.split("1;2;3", ';') = ["1", "2", "3"] 

Tuy nhiên, bạn vẫn phải chuyển đổi chuỗi thành số nguyên.

Trên thực tế, đối với việc tách java.lang.String.split() sẽ làm việc giống như tốt: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

(2) Sử dụng các 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(); 

Và để có được nó trở lại:

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

Mã này không nắm bắt được NPE hoặc NumberFormatExceptions vì intSet được đảm bảo không có t chứa bất kỳ null. Nhưng tất nhiên, nếu bạn không thể đảm bảo rằng trong mã của bạn, bạn nên bao quanh điều này với một try/catch.

+0

Giải pháp 2 là cách để đi – Cobbles

+0

Giải pháp thứ 2 là tốt đẹp, nhưng nó sẽ mất thứ tự các yếu tố. – blackwolf

+0

@blackwolf Hãy thử với 'java.util.SortedSet' - có lẽ Android sẽ tuần tự hóa nó một cách chính xác. – Risadinha

1

Tôi thích sử dụng JSON, có thể được lưu trữ và truy lục dưới dạng chuỗi, để thể hiện bất kỳ dữ liệu phức tạp nào trong SharedPreferences. Vì vậy, trong trường hợp của một mảng 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; 
    } 
} 

Vẻ đẹp là ý tưởng tương tự có thể được áp dụng cho bất kỳ biểu diễn dữ liệu phức tạp khác như một JSON.

0

Dưới đây là cách "chuyển sang chuỗi bằng dấu phẩy" giải pháp có thể nhìn vào Kotlin, thực hiện như chức năng mở rộng:

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

Bằng cách đó bạn có thể sử dụng putIntArray(String, IntArray)getIntArray(String) giống như đặt khác và phương pháp thiết :

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) 
Các vấn đề liên quan