2012-08-27 60 views
10

在API級別8中將字符串ArrayList保存爲SharedPreferences的最佳方法是什麼?我現在能想到的唯一方法是將所有字符串保存爲一個用逗號分隔的字符串並將其保存。但我不知道字符串是否有最大尺寸。將字符串的數組列表保存到共享偏好

有沒有更好的方法來做到這一點?

回答

10

我建議您將arraylist保存爲Android中的內部存儲文件。例如,對於一個名爲text_lines數組列表:

內部存儲文件IO(寫):

try { 
    //Modes: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE 
    FileOutputStream output = openFileOutput("lines.txt",MODE_WORLD_READABLE); 
    DataOutputStream dout = new DataOutputStream(output); 
    dout.writeInt(text_lines.size()); // Save line count 
    for(String line : text_lines) // Save lines 
     dout.writeUTF(line); 
    dout.flush(); // Flush stream ... 
    dout.close(); // ... and close. 
} 
catch (IOException exc) { exc.printStackTrace(); } 

INTERAL存儲文件IO(讀):

FileInputStream input = openFileInput("lines.txt"); // Open input stream 
DataInputStream din = new DataInputStream(input); 
int sz = din.readInt(); // Read line count 
for (int i=0;i<sz;i++) { // Read lines 
    String line = din.readUTF(); 
    text_lines.add(line); 
} 
din.close(); 
+0

感謝這是我最終使用,我敢肯定其他答案也會工作 – Peter

+1

好,這將是更容易,而不是讓你的情況使sharedprefereces複雜的事情。祝你好運! – Ali

+1

雖然這會起作用,但共享偏好具有持續到應用程序卸載的特殊屬性,但另一方面,如果我們使用SD卡存儲,則必須明確刪除文件。 –

3

有一種方法,putStringSet(),在SharedPreferences.Editor,如果你的字符串是Set,你可以利用它。 (也就是說,不重複)。

3

如果您正在使用的API(如8級),你不能使用PUT/getStringSet(),那麼這是一個可能的解決方案,但這是非常昂貴如果要存儲大不靈活名單。我的意思是創建一個像datastructure一樣的簡單數組結構的映射會產生巨大的開銷,如果性能很重要。

要保存它:

public static void writeList(Context context, List<String> list, String prefix) 
{ 
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = prefs.edit(); 

    int size = prefs.getInt(prefix+"_size", 0); 

    // clear the previous data if exists 
    for(int i=0; i<size; i++) 
     editor.remove(prefix+"_"+i); 

    // write the current list 
    for(int i=0; i<list.size(); i++) 
     editor.putString(prefix+"_"+i, list.get(i)); 

    editor.putInt(prefix+"_size", list.size()); 
    editor.commit(); 
} 

找回它:

public static List<String> readList (Context context, String prefix) 
{ 
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE); 

    int size = prefs.getInt(prefix+"_size", 0); 

    List<String> data = new ArrayList<String>(size); 
    for(int i=0; i<size; i++) 
     data.add(prefs.getString(prefix+"_"+i, null)); 

    return data; 
} 

而且實際使用它:

List<String> animals = new ArrayList<String>(); 
animals.add("cat"); 
animals.add("bear"); 
animals.add("dog"); 

writeList(someContext, animals, "animal"); 

,並檢索它:

List<String> animals = readList (someContext, "animal"); 

如果您不限制使用SharedPreferences,請考慮使用SQLiteDatabase

+1

嘿兄弟我使用你的代碼,但檢索空值,因爲這個代碼:data.add(prefs.getString(prefix +「_」+ i,null)); –

24

如果你能保證你的String S IN ArrayList不包含逗號,你可以簡單地使用

List<String> list = new ArrayList<String>(); 
... 
editor.putString(PREF_KEY_STRINGS, TextUtils.join(",", list)); 

和閱讀列表

String serialized = prefs.getString(PREF_KEY_STRINGS, null); 
List<String> list = Arrays.asList(TextUtils.split(serialized, ",")); 

您通過的內存限制裝置。使用後臺線程讀取/寫入共享首選項是一種很好的做法。

+0

不錯的做法,很簡單。 –

+0

序列化做了什麼? –

+0

不要忘記Arrays.asList給出了一個固定大小的ArrayList,如果你嘗試添加一些東西,它將拋出UnsupportedOperation。你可以改變它像新的ArrayList(Arrays.asList(TextUtils.split(serialized,「,」)))。 – Nikola