【问题标题】:As simple as saving a Hashset in the SharedPrefs就像在 SharedPrefs 中保存一个 Hashset 一样简单
【发布时间】:2018-01-10 18:38:21
【问题描述】:

我试图为我的 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<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;

现在我期待看到的是:checkingString 被正确附加和保存,但 HashSet 每次重新启动应用程序时都会丢失添加的值。 但是,现在一切正常,每次重新启动应用程序时,HashSet 都会正确保存和恢复。有人可以向我解释这怎么可能?我所做的唯一更改是向 sharedPrefs 添加另一个字符串,这如何影响 HashSet?谢谢你的时间

【问题讨论】:

    标签: android sharedpreferences persistence hashset


    【解决方案1】:

    希望这会对您有所帮助。对于这类问题,我制作了两个函数来使用 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;
        }
    

    【讨论】:

    • 我只是想解释一下为什么会这样。我的方法也有效
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2012-10-06
    • 1970-01-01
    • 2011-06-09
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多