【问题标题】:Can I get the key from SharedPreferences if a know the associated value?如果知道关联的值,我可以从 SharedPreferences 获取密钥吗?
【发布时间】:2018-11-28 18:41:08
【问题描述】:

如果我知道与之配对的“值”值,是否可以从 SharedPreferences 文件中获取“键”值?

假设我进入了 SharedPreferences 文件,并通过用户操作获得了值“London, UK”。

现在我想获取与值“London, UK”相关联的 KEY,然后将其用于下一步,这可能吗?

我现在使用的代码从 SharedPerferences 中获取所有数据,按值排序,用这些数据填充 AlertDialog,处理用户从 AlertDialog 中选择一个选项,然后返回该选项的值。我现在需要与值配对的 KEY。

public void openServerDialog() {


        final SharedPreferences myPrefs = this.getSharedPreferences("FileName", MODE_PRIVATE);
        TreeMap<String, ?> keys = new TreeMap<String, Object>(myPrefs.getAll());
        for (Map.Entry<String, ?> entry : keys.entrySet()) {
            Log.i("map values", entry.getKey());
            //some code
        }


      List<Pair<Object, String>> sortedByValue = new LinkedList<Pair<Object,String>>();
        for (Map.Entry<String, ?> entry : keys.entrySet()) {
            Pair<Object, String> e = new Pair<Object, String>(entry.getValue(), entry.getKey());
            sortedByValue.add(e);
        }

     // Pair doesn't have a comparator, so you're going to need to write one.
        Collections.sort(sortedByValue, new Comparator<Pair<Object, String>>() {
            public int compare(Pair<Object, String> lhs, Pair<Object, String> rhs) {

                String sls = String.valueOf(lhs.first);
                String srs = String.valueOf(rhs.first);
                int res = sls.compareTo(srs);
                // Sort on value first, key second
                return res == 0 ? lhs.second.compareTo(rhs.second) : res;
            }
        });

        for (Pair<Object, String> pair : sortedByValue) {
            Log.i("map values", pair.first + "/" + pair.second);
        }


      Collection<?> stringArrayList = keys.values();
      final CharSequence[] prefsCharSequence = stringArrayList.toArray(new CharSequence[stringArrayList.size()]);

        new AlertDialog.Builder(this)   
        .setTitle(R.string.server_title)
        .setItems(prefsCharSequence, 
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialoginterface, int i) {

                setServer(prefsCharSequence[i]);   

            }
        })
        .show();
    }

【问题讨论】:

    标签: android sharedpreferences key-value


    【解决方案1】:

    您可以使用SharedPreferences.getAll 方法。

    String findKey(SharedPreferences sharedPreferences, String value) {
        for (Map.Entry<String, ?> entry: sharedPreferences.getAll().entrySet()) {
            if (value.equals(entry.getValue())) {
                return entry.getKey();
            }
        }
        return null; // not found
    }
    

    您应该注意,虽然键在 SharedPreferences 中保证是唯一的,但不能保证值是唯一的。因此,此函数将仅返回第一个匹配值的键。

    【讨论】:

    • 感谢您的信息。我对 Android 很陌生,将其放入我的代码时遇到了一些错误。我应该用我项目中的数据替换您的任何代码吗?
    • 需要导入 SharedPreferences 类和 Map 类。
    • 我已经将这两个都导入了。我成功地使用树图来获取值,现在我有了我需要该值的键的值。您的代码看起来正是我所需要的,由于我缺乏经验,我不确定如何执行。我将使用更多数据编辑我的初始帖子
    • 发生错误foreach not applicable to type 'java.util.Map&lt;java.lang.String,capture&lt;?»'。你应该在sharedPreferences.getAll() 之后添加.entrySet() 来解决这个错误。所以应该是for (Map.Entry&lt;String, ?&gt; entry: sharedPreferences.getAll().entrySet()){...}
    【解决方案2】:

    你可以试试:

    SharedPreferences prefs = context.getSharedPreferences(context.getPackageName(), 0);
    
    Iterator iter = prefs.getAll().entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry pair = (Map.Entry)iter.next();
           // Check the value here
        }
    

    您可以遍历该映射并查找所需的值。

    【讨论】:

    • 我将如何从我拥有的值中获取密钥?我在开场问题中的代码为我提供了价值,但我需要该价值的密钥。
    • 复制该代码时出现“只能迭代数组或 java.lang.Iterable 的实例”错误,有什么想法吗?
    • 谢谢,上帝消除了大部分错误。我现在得到一个 SynergyApplication 无法解决,上下文也无法解决。我想我必须用我的项目中的东西替换这些?
    • 是的,你应该用 Context (applicationContext, Activity) 替换它
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2010-10-28
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多