2012-01-29 148 views
10

我正在開發一個字典應用程序。在我的應用程序中,我假設用戶想要保存喜歡的單詞。我決定使用SharedPreferences來保存這些值(我知道SQLite和文件比較好,但我堅持使用「SharedPreferences」,因此請繼續使用它)。這裏下面如何使用SharedPreferences保存多個值?

是我的代碼:

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

的問題是,它不會保留超過一個最喜歡的詞。我的意思是隻保存一個最喜歡的單詞,當添加一個新單詞時,先前的單詞被刪除。

那麼,上面的代碼怎麼編輯才能解決這個問題呢?

你們能幫忙嗎?非常感謝你。

回答

17

您可以通過在單個字符串中添加多個收藏夾來保存多個收藏夾,每個收藏夾項以逗號分隔。然後您可以使用convertStringToArray方法將其轉換爲字符串數組。這裏是完整的源代碼。
使用MyUtility方法保存多個收藏夾項目。

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

得到所有收藏的字符串數組保存

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

在單獨的實用工具類

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

保存這些方法如果您有添加額外的收藏夾。然後從SharedPreference得到最喜歡的字符串,並附加逗號+最喜歡的項目,並將其保存回SharedPreference
*您可以使用任何其他字符串作爲分隔符而不是逗號。

+0

非常感謝。但我還不知道編程的內容。這裏是字符串形式SharedPreferences:' dict_name :: 149272 :: go,'。你的代碼應該放在哪裏? – 2012-01-29 15:47:17

+0

@ user998032我已經添加了代碼來解釋我們如何添加多個最喜歡的項目。您可以按原樣使用代碼,它可以爲您工作。 – 2012-01-29 16:02:04

+0

@@ Muhammad Nabeel Arif:非常感謝,但仍然沒有運氣,對不起!我想要在onClick之後保存最愛,但在上述編輯後的代碼後會產生許多錯誤。 – 2012-01-29 17:04:50

7

SharedPreferences通過簡單的鍵/值工作,所以當您爲同一個鍵提供新值時,先前的值將被覆蓋。要做你想做的事情的唯一方法就是使用不同的按鍵,這對於你想要做的事情你可能不應該使用SharedPreferences這一事實提示。

5

蜂窩加入putStringSet方法,這樣你就可以使用,如果你沒有支持任何低於蜂窩:如果你需要預先蜂窩設備的支持

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

,你將不得不與你自己的計劃。

一種可能性是將單詞作爲逗號分隔值存儲在一個首選項中。

另一種方法是爲每個新單詞「favourite1」,「favourite2」,「favourite3」生成一個新的密鑰,並有另一個用於存儲單詞數量的偏好。

+0

這是真的,但不幸的是,我正在做蜂窩設備前的事情。非常感謝。 – 2012-01-29 15:58:53

2

每次單擊按鈕時,都會用已存在的鍵保存最喜歡的單詞:favorite,然後重寫它。要保存多個單詞,您必須使用不同的鍵保存單詞。 所以每次保存最喜歡的一句話,你可以這樣做:

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

非常感謝。我喜歡你的方法,但是當它被應用時,它會產生錯誤**增加值**,說預計VariableDeclarationId後... – 2012-01-29 15:56:23

+0

@ user998032我編輯了我的答案,我忘了添加'int'到遞增變量的聲明不要忘記在方法onClick()中添加第一行,即變量聲明)。 – Luksprog 2012-01-29 16:02:26

+0

非常感謝,slukian!它的工作原理並不如我預期的那樣。 SharePreferences現在將字符串保存爲:' dict_name :: 157562 ::堆up, dict_name :: 31377 :: bell, dict_name :: 349333 :: tell, dict_name :: 349333 :: tell, dict_name :: 11834 :: am,',但是隻加載第一個最喜歡的單詞(「favourite0」)以供查看。 – 2012-01-29 17:09:43

1

嗯,這是因爲實際的偏好存儲不是字符串列表,只是一個單一的一個,所以每當你說putString()你覆蓋以前的值。將多個對象存儲在單個首選項字符串中的一種好方法是使用JSON。只需序列化該值,然後將其寫入它們。它也有直接轉換回你想要的任何複雜性的對象的好處。如果您決定繼續這條路線,請考慮使用Jackson

1

您可以使用TreeMap(或實現Serializable的其他類型的列表)。以下是我最近處理收藏夾列表的方式。在TreeMap中,Favorite是我使用的類。在你的情況下,你可以使用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) { 

    } 
    }  
} 

你也可以避免你正在做的分離值的「::」事情。

希望有幫助...

+0

非常感謝。我曾嘗試過類似的事情,但在收藏夾列出時出現問題。 – 2012-01-29 15:50:28

相關問題