2012-08-27 30 views
10

Cách tốt nhất để lưu một chuỗi ArrayListSharedPreferences trong API cấp 8 là gì? Cách duy nhất tôi có thể nghĩ đến bây giờ là để lưu tất cả các chuỗi vào một chuỗi cách nhau bằng dấu phẩy và lưu nó theo cách đó. Nhưng tôi không biết nếu có một kích thước tối đa cho chuỗi.Lưu danh sách chuỗi các Chuỗi vào các tùy chọn được chia sẻ

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

10

Tôi đề nghị bạn lưu danh sách mảng làm Tệp lưu trữ nội bộ trong Android. Ví dụ cho một ArrayList tên text_lines:

file lưu trữ nội bộ IO (Viết):

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 lưu trữ file IO (Reading):

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

Cảm ơn đây là những gì tôi đã sử dụng, tôi chắc rằng các câu trả lời khác sẽ hoạt động quá – Peter

+1

Tốt, sẽ dễ dàng hơn thay vì làm mọi thứ phức tạp với các tệp chia sẻ trong trường hợp của bạn. Chúc may mắn! – Ali

+1

Mặc dù điều này sẽ hoạt động, sở thích được chia sẻ có đặc tính riêng biệt cho đến khi gỡ cài đặt ứng dụng, nhưng mặt khác nếu chúng tôi đang sử dụng bộ nhớ thẻ SD, chúng tôi sẽ phải xóa tệp một cách rõ ràng. –

3

Có một phương pháp, putStringSet(), trong SharedPreferences.Editor, bạn có thể tận dụng lợi thế nếu chuỗi của bạn là Set. (Tức là, không có bản sao).

3

Nếu bạn đang sử dụng một api (như mức 8), nơi bạn không thể sử dụng đặt/getStringSet(), thì đây là một giải pháp khả thi, nhưng đây là rất tốn kémkhông linh hoạt nếu bạn muốn lưu trữ lớn hơn danh sách. Tôi có nghĩa là tạo ra một bản đồ như datastructure cho một cấu trúc đơn giản giống như mảng tạo ra một chi phí rất lớn, nếu preformance là quan trọng.

Để lưu nó:

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

Để lấy nó:

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

Và để thực sự sử dụng nó:

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

writeList(someContext, animals, "animal"); 

Và để lấy nó:

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

Nếu bạn không bị giới hạn sử dụng SharedPreferences, hãy cân nhắc sử dụng SQLiteDatabase!

+1

hey anh tôi đang sử dụng mã của bạn nhưng lấy giá trị null vì mã này: data.add (prefs.getString (tiền tố + "_" + i, null)); –

24

Nếu bạn có thể đảm bảo String của bạn trong ArrayList không chứa dấu phẩy, bạn chỉ có thể sử dụng

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

và đọc danh sách

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

Bạn đang bị hạn chế bởi bộ nhớ của thiết bị. Thực hành tốt là sử dụng chuỗi nền để đọc/ghi tùy chọn được chia sẻ.

+0

Cách tiếp cận tốt đẹp, đơn giản. –

+0

Số serialized làm gì? –

+0

Đừng quên Arrays.asList đưa ra một ArrayList có kích thước cố định sẽ ném UnsupportedOperation nếu bạn cố gắng thêm cái gì đó vào nó. Bạn có thể thay đổi nó như ArrayList mới (Arrays.asList (TextUtils.split (serialized, ","))). – Nikola

Các vấn đề liên quan