2012-01-29 23 views
10

Tôi đang phát triển một ứng dụng từ điển. Trong ứng dụng của tôi, tôi cho rằng người dùng muốn lưu các từ yêu thích. Tôi đã quyết định sử dụng SharedPreferences để lưu các giá trị này (Tôi biết rằng SQLite và các tệp tốt hơn nhưng tôi bị mắc kẹt với "SharedPreferences", vì vậy hãy tiếp tục với nó).Cách sử dụng SharedPreferences để lưu nhiều hơn một giá trị?

đây dưới đây là mã của tôi:

@Override 
public void onClick(View v) {          
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putString("favourite", mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     editor.commit();  
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

Vấn đề là nó không giữ lại nhiều hơn một từ yêu thích. Tôi có nghĩa là chỉ một từ yêu thích được lưu và khi một từ mới được thêm vào, từ trước đó sẽ bị xóa.

Vì vậy, làm cách nào để mã trên được chỉnh sửa để vấn đề này được giải quyết?

Các bạn có thể trợ giúp không? Cảm ơn nhiều.

Trả lời

17

Bạn có thể lưu nhiều mục ưa thích vào một tùy chọn bằng cách thêm nhiều mục yêu thích vào một chuỗi, mỗi mục yêu thích được phân tách bằng dấu phẩy. Sau đó, bạn có thể sử dụng phương thức convertStringToArray để chuyển đổi nó thành String Array. Đây là mã nguồn đầy đủ.
Sử dụng Phương pháp của tôi để lưu nhiều mục yêu thích.

  MyUtility.addFavoriteItem(this, "Sports"); 
      MyUtility.addFavoriteItem(this, "Entertainment"); 

có được chuỗi mảng của tất cả các ưa thích đã lưu

String[] favorites = MyUtility.getFavoriteList(this);// returns {"Sports","Entertainment"}; 

Lưu các phương pháp này trong riêng lớp Utility

public abstract class MyUtility { 

    public static boolean addFavoriteItem(Activity activity,String favoriteItem){ 
     //Get previous favorite items 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     // Append new Favorite item 
     if(favoriteList!=null){ 
      favoriteList = favoriteList+","+favoriteItem; 
     }else{ 
      favoriteList = favoriteItem; 
     } 
     // Save in Shared Preferences 
     return putStringInPreferences(activity,favoriteList,"favorites"); 
    } 
    public static String[] getFavoriteList(Activity activity){ 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     return convertStringToArray(favoriteList); 
    } 
    private static boolean putStringInPreferences(Activity activity,String nick,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, nick); 
     editor.commit();       
     return true;   
    } 
    private static String getStringFromPreferences(Activity activity,String defaultValue,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     String temp = sharedPreferences.getString(key, defaultValue); 
     return temp;   
    } 

    private static String[] convertStringToArray(String str){ 
     String[] arr = str.split(","); 
     return arr; 
    } 
} 

Nếu bạn phải bổ sung thêm yêu thích. Sau đó nhận chuỗi yêu thích từ SharedPreference và thêm dấu phẩy + mục yêu thích và lưu lại vào SharedPreference.
* Bạn có thể sử dụng bất kỳ chuỗi nào khác cho dấu phân cách thay vì dấu phẩy.

+0

Cảm ơn bạn rất nhiều.Nhưng tôi chưa hiểu những gì để lập trình làm. Đây là dạng chuỗi SharedPreferences: ' dict_name :: 149272 :: go,'. Mã của bạn nên được đặt ở đâu? –

+0

@ user998032 Tôi đã thêm mã để giải thích cách chúng tôi có thể thêm nhiều mục yêu thích. Bạn có thể sử dụng mã như nó, nó sẽ làm việc cho bạn. –

+0

@@ Muhammad Nabeel Arif: Cảm ơn rất nhiều, nhưng vẫn không may mắn, xin lỗi! Tôi muốn yêu thích được lưu sau onClick nhưng nhiều lỗi được tạo sau mã đã chỉnh sửa ở trên. –

7

SharedPreferences hoạt động qua khóa/giá trị đơn giản để khi bạn cung cấp giá trị mới cho cùng một khóa, giá trị trước đó sẽ bị ghi đè. Cách duy nhất để làm những gì bạn đang cố gắng làm là sử dụng các khóa khác nhau, loại gợi ý hướng tới thực tế rằng bạn có lẽ không nên sử dụng SharedPreferences cho những gì bạn đang cố gắng làm.

5

Honeycomb thêm phương pháp putStringSet, vì vậy bạn có thể sử dụng nếu bạn không có để hỗ trợ bất cứ điều gì ít hơn Honeycomb:

@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     Set<String> faveSet = faves.getStringSet("favourite"); 
     faveSet.add(mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putStringSet("favourite", faveSet); 
     editor.commit(); 
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

Nếu bạn cần hỗ trợ cho tiền Honeycomb thiết bị, bạn sẽ phải đến với kế hoạch của riêng bạn.

Một khả năng là lưu trữ các từ dưới dạng giá trị được phân tách bằng dấu phẩy trong một tùy chọn.

Cách khác là tạo khóa mới cho từng từ mới, "favourite1", "favourite2", "favourite3" và có tùy chọn khác mà bạn sử dụng để lưu trữ số từ.

+0

Đó là sự thật, nhưng tiếc là tôi đang làm việc cho các thiết bị trước Honeycomb. Cảm ơn nhiều. –

2

Mỗi khi bạn nhấp vào nút bạn lưu từ yêu thích bằng khóa đã có: favorite và bạn ghi đè lên. Để lưu nhiều hơn một từ, bạn phải lưu các từ bằng các phím khác nhau. Vì vậy, mỗi khi bạn lưu một từ ưa thích của bạn có thể làm:

private static int incrementedValue = 0; 
... 
@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    SharedPreferences.Editor editor = faves.edit(); 
    editor.putString("favourite" + incrementedValue, mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
    editor.commit(); 

    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
    incrementedValue++; 
} 
+0

Cảm ơn bạn rất nhiều. Tôi thích cách tiếp cận của bạn nhưng khi nó được áp dụng, nó tạo ra lỗi với ** incrementedValue **, nói biến VariableDeclarationId được mong đợi sau ... –

+0

@ user998032 Tôi đã sửa câu trả lời của mình, tôi quên thêm 'int' vào khai báo biến incrementedValue (đừng quên thêm dòng đầu tiên, khai báo biến, trong lớp của bạn với phương thức onClick()). – Luksprog

+0

Cảm ơn rất nhiều, slukian! Nó hoạt động nhưng không như tôi mong đợi. SharePreferences bây giờ lưu chuỗi như: ' dict_name :: 157562 :: heap up, dict_name :: 31377 :: chuông, dict_name :: 349333 :: tell, dict_name :: 349333 :: tell, dict_name :: 11834 :: am,', nhưng chỉ từ yêu thích đầu tiên ("favourite0") được tải để xem. –

1

Vâng đó là bởi vì việc lưu trữ ưu đãi thực tế không phải là một danh sách các chuỗi, chỉ là một trong những đơn, vì vậy bất cứ khi nào bạn nói putString() bạn ghi đè lên giá trị trước đó. Cách tốt để lưu trữ nhiều đối tượng trong một chuỗi tùy chọn duy nhất là sử dụng JSON. Đơn giản chỉ cần serialize giá trị và sau đó viết nó cho họ. Nó cũng có lợi ích của việc chuyển đổi trực tiếp trở lại thành một đối tượng của bất kỳ sự phức tạp nào bạn muốn. Xem xét sử dụng Jackson nếu bạn quyết định đi tuyến đường này.

1

Bạn có thể sử dụng TreeMap (hoặc loại danh sách khác triển khai Serializable). Đây là cách tôi xử lý một danh sách các mục yêu thích gần đây. Trong TreeMap, Favorite là một lớp tôi sử dụng. Trong trường hợp của bạn, bạn chỉ có thể sử dụng TreeMap < Integer, String>.

private static TreeMap<Integer, Favourite> favourites; 

... 
... 
... 

// load favourites 
FileInputStream fis=null; 
ObjectInputStream ois = null; 
try { 
    fis = context.openFileInput(context.getString(R.string.favourites_file)); 
    try { 
    ois = new ObjectInputStream(fis); 
    favourites = (TreeMap<Integer, Favourite>) ois.readObject(); 
    } catch (StreamCorruptedException e) { 
    } catch (IOException e) { 
    } catch (ClassNotFoundException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    try { 
    if (ois!=null){ 
     ois.close(); 
    } 
    } catch (IOException e) { 
    }  
} 

if (favourites==null){ 
    favourites = new TreeMap<Integer, Favourite>();  
} 

... 
... 
... 

// save favourites 
FileOutputStream fos=null; 
ObjectOutputStream oos=null; 
try { 
    fos = context.openFileOutput(context.getString(R.string.favourites_file), MODE_PRIVATE); 
    try { 
    oos = new ObjectOutputStream(fos); 
    oos.writeObject(favourites); 
    } catch (IOException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    if (oos!=null){ 
    try { 
     oos.close(); 
    } catch (Exception e2) { 

    } 
    }  
} 

Bạn cũng có thể tránh điều "::" bạn đang làm để phân tách các giá trị.

Hy vọng rằng sẽ giúp ...

+0

Cảm ơn rất nhiều. Tôi đã thử tương tự trước đây nhưng có vấn đề khi yêu thích được liệt kê. –

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