Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SharedReference中存储键值对?_Java_Android_Sharedpreferences_Key Value - Fatal编程技术网

Java 如何在SharedReference中存储键值对?

Java 如何在SharedReference中存储键值对?,java,android,sharedpreferences,key-value,Java,Android,Sharedpreferences,Key Value,我正在开发一个随机生成密码的应用程序。我正在添加一个“保存”功能,以便用户可以在SharedReferences中保存密码。(这不是您应该对密码执行的操作) 我有一个名为PasswordActivity的活动,在该活动中我显示保存的密码 这就是我保存密码的方式:我提示用户输入密码的名称/密钥,以便他/她以后可以识别它。然后我在实用程序类中使用以下方法将密钥和密码保存在SharedReferences中: public static int savePassword (Context c, Str

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

我有一个名为
PasswordActivity
的活动,在该活动中我显示保存的密码

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

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;
}
那很好。但是,当我生成另一个密码并保存它时,这两个密码集变得很混乱:

keys: key1 key2 values: value2 value1 这是不正确的。看了这些文件后,我发现:

它不保证集合的迭代顺序;特别是,它不能保证订单在一段时间内保持不变

我猜这就是导致错误结果的原因


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

我建议使用一个数据库,例如,用户可以为应用程序提供主密码短语,并且所有数据都加密存储在设备上

但是,让我们假设,为了成功击退外来入侵并防止大规模屠杀无数人,您必须使用
SharedReferences
实现这一点。在那之后,你需要和一个聪明的同伴乘坐一艘被征用的外星飞船飞行,并成功地将你的应用程序上传到一艘外星母船的计算机系统中(幸运的是,这艘母船碰巧运行的是安卓系统,因为安卓系统在整个银河系拥有巨大的市场份额)

要么:

  • 将每个键和值作为
    SharedReferences
    中的单独条目。毕竟,
    SharedReferences
    是一个键值存储。为您的键和值使用专用的首选项文件(以免与您可能要存储的任何其他内容发生冲突),这样您就知道所有键都是来自用户的键

  • HashMap
    封送为JSON或XML或其他格式,并将其另存为字符串,根据需要对其进行解组


  • 由于要存储多个名称和密码,我建议使用本地SQLite数据库。SharedReference用于单个值,而不是一组值


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

    您可以提供指向SugarOrm或其他东西的链接吗?如何“封送”?它是某种序列化吗?@Sweeper:是的,在Java中,“serialize”或“convert”可能是更好的动词。基本上,为数据创建一个字符串表示形式,这样您就可以保存该表示形式并在以后再次解析它,以恢复原始数据结构。 keys: key1 values: value1 keys: key1 key2 values: value2 value1
    {key1, value2}, {key2, value1}