如何使用SharedPreferences保存多个值?

Nia*_*yle 11 database android sharedpreferences

我正在开发一个字典应用程序.在我的应用程序中,我假设用户想要保存喜欢的单词.我决定使用SharedPreferences来保存这些值(我知道SQLite和文件更好但我坚持使用"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();   
}
Run Code Online (Sandbox Code Playgroud)

问题是它不会保留多个最喜欢的单词.我的意思是只保存了一个最喜欢的单词,当添加新单词时,前一个单词被删除.

那么,如何编辑上面的代码以便解决这个问题呢?

你们有帮助吗?非常感谢你.

Muh*_*rif 19

通过在单个字符串中添加多个收藏夹,您可以在一个首选项中保存多个收藏夹,每个收藏夹项目用逗号分隔.然后您可以使用convertStringToArray方法将其转换为String Array.这是完整的源代码.
使用MyUtility Methods保存多个喜欢的项目.

            MyUtility.addFavoriteItem(this, "Sports");
            MyUtility.addFavoriteItem(this, "Entertainment");
Run Code Online (Sandbox Code Playgroud)

获取保存的所有收藏夹的String数组

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

将这些方法保存在单独的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你必须添加额外的收藏夹.然后从中获取最喜欢的字符串SharedPreference并附加逗号+最喜欢的项目并将其保存回来SharedPreference.
*您可以使用任何其他字符串作为分隔符而不是逗号.


Lux*_*ode 7

SharedPreferences通过简单的键/值工作,因此当您为同一个键提供新值时,将覆盖之前的值.做你想要做的事情的唯一方法是使用不同的键,这些暗示你可能不应该SharedPreferences用于你想要做的事情.


Bri*_*ham 5

Honeycomb添加了这种putStringSet方法,所以你可以使用它,如果你不需要支持少于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();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要支持预蜂窝设备,您必须提出自己的方案.

一种可能性是将单词作为逗号分隔值存储在一个首选项中.

另一种方法是为每个新单词"favourite1","favourite2","favourite3"生成一个新密钥,并使用另一个首选项来存储单词的数量.