就像在SharedPrefs中保存Hashset一样简单

时间:2017-08-03 08:56:14

标签: android sharedpreferences persistence hashset

我试图为我的Android应用程序编写一个简单的方法。该方法应该找到一个不包含在HashSet中的整数[0-49]。之后应该使用putStringSet()方法将HashSet保存在sharedPrefs中。下面我提供了我写的代码。

    HashSet aHashSet;
    SharedPreferences sharedPreferences;
    int id;

    sharedPreferences = getSharedPreferences("prefs", MODE_PRIVATE);
    aHashSet = (HashSet) sharedPreferences.getStringSet("aHashSet", null);

    if (aHashSet == null)
        aHashSet = new HashSet();


    for (id = 0; id < 50; ++id) {
        if (aHashSet.contains(id))
            continue;
        else {
            aHashSet.add(id);
            break;
        }

    }


    Log.d("myClassName", String.valueOf(sharedPreferences.edit().putStringSet("aHashSet", aHashSet).commit()));

    return id;

我每次向集合添加内容时都检查了日志,并将其保存在shredPrefs中,我得到了一个真实的(作为成功的)提交。虽然这在应用程序运行时运行良好,但在应用程序关闭后,HashSet未正确保存,起始编号始终为0。

所以我试着调试这个,我以为我会使用一个字符串,我会将数字附加到它然后保存它,以便检查问题是否是我无法正确保存Hashset,所以我在下面添加这个逻辑。

    HashSet<String> aHashSet;
    int id;

    aHashSet = (HashSet) sharedPreferences.getStringSet("aHashSet", null);
    String checkingString = sharedPreferences.getString("cs","");

    if (aHashSet == null)
        aHashSet = new HashSet();


    for (id=0;id<50;++id){
        if(aHashSet.contains(String.valueOf(id)))
            continue;
        else{
            aHashSet.add(String.valueOf(id));
            break;
        }

    }

    checkingString+= id;
    Log.d("myClassName",String.valueOf(sharedPreferences.edit().putStringSet("aHashSet",aHashSet).commit()));
    Toast.makeText(this, checkingString, Toast.LENGTH_SHORT).show();


    sharedPreferences.edit().putString("cs",checkingString).commit();
    return id;

现在我期待看到的是:checkString要追加并正确保存,但HashSet会在每次重新启动应用时丢失添加的值。 但是,现在一切正常,每次重新启动应用时,HashSet都会正确保存并恢复。有人可以向我解释这有可能吗?我做的唯一改变是在sharedPrefs中添加另一个字符串,这怎么会影响HashSet?谢谢你的时间

1 个答案:

答案 0 :(得分:0)

希望这会对你有所帮助。对于这种类型的问题,我已经使用Hashmap

创建了两个用于存储和检索多个值的函数

将数据存储为首选

public static void storePreference(HashMap<String, String> parameters) {
        SharedPreferences.Editor editor = ManageMyAppsApplication.sharedPref
                .edit();
        Iterator<Map.Entry<String, String>> it = parameters.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> pairs = it.next();
            editor.putString((String) pairs.getKey(), (String) pairs.getValue());
        }
        editor.commit();
    }

从偏好中检索数据

public static HashMap<String, String> getPreference(String[] keys) {
        HashMap<String, String> parameters = new HashMap<String, String>();
        for (String key : keys) {
            parameters.put(key,
                    ManageMyAppsApplication.sharedPref.getString(key, null));
        }
        return parameters;
    }