gpt4 book ai didi

java - 如何在 SharedPreferences 中存储键值对?

转载 作者:行者123 更新时间:2023-11-30 01:50:03 25 4
gpt4 key购买 nike

我正在开发一个随机生成密码的应用程序。我正在添加一个“保存”功能,以便用户可以将他们的密码保存在 SharedPreferences 中。 . (这不是您应该对密码执行的操作)

我有一个名为 PasswordActivity 的 Activity 并在该 Activity 中显示保存的密码。

这是我保存密码的方式:我提示用户输入密码的名称/ key ,以便他/她以后可以识别它。然后我在实用程序类中使用以下方法将 key 和密码保存在 SharedPreferences 中:

public static int savePassword (Context c, String passwordKey, String passwordValue) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (c);
Set<String> keys = prefs.getStringSet (PASSWORD_KEYS, new HashSet<String> ());
Set<String> values = prefs.getStringSet (PASSWORD_VALUES, new HashSet<String> ());
SharedPreferences.Editor editor = prefs.edit ();

boolean duplicateKey = !keys.add (passwordKey);
boolean duplicateValue = !values.add (passwordValue);

if (duplicateKey)
return KEY_DUPLICATE;
if (duplicateValue)
return VALUE_DUPLICATE;

editor.putStringSet (PASSWORD_KEYS, keys).
putStringSet (PASSWORD_VALUES, values).apply ();

return SUCCESS;
}

我写了另一个方法来获取密码和他们的名字。该方法返回 HashMap<String, String>正如您可能已经猜到的那样。

public static HashMap<String, String> getPasswords (Context c) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences (c);
Set<String> keys = prefs.getStringSet (PASSWORD_KEYS, new HashSet<String> ());
Set<String> values = prefs.getStringSet (PASSWORD_VALUES, new HashSet<String> ());

ArrayList<String> keysList = new ArrayList<> ();
ArrayList<String> valuesList = new ArrayList<> ();

for (String key : keys) {
keysList.add (key);
}

for (String value : values) {
valuesList.add (value);
}

HashMap<String, String> map = new HashMap<> ();

for (int i = 0 ; i < keys.size () ; i++) {
map.put (keysList.get (i), valuesList.get (i));
}

return map;
}

我承认代码很乱。我先把两个set里面的东西都弄出来,变成ArrayList s 并将数组列表中的东西添加到 map 并返回。

呸!工作量很大!

现在当用户生成密码并保存它时,这两组包含正确的东西:(这些是假数据)

keys:key1values:value1

That's all good. But when I generate another password and save it, the two sets become messy:

keys:key1key2values:value2value1

Now when I call the getPasswords method, it will return

{key1, value2}, {key2, value1}

这是不正确的。查看文档后,我发现:

It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.

我想这是导致错误结果的原因。

所以我想知道是否有其他方法来存储这些密码及其名称?

最佳答案

当您存储多个名称和密码时,我建议使用本地 SQLite 数据库。 SharedPreferences 适用于单个值,而不是值集。

如果您不愿意设置整个 SQLiteOpenHelper 和所有原始 SQL 代码,您可以看看一些 ORM 助手,例如 SugarOrm(我目前使用它,它非常容易设置和使用)

关于java - 如何在 SharedPreferences 中存储键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com