android - 如果知道关联值,我可以从 SharedPreferences 获取 key 吗?

标签 android sharedpreferences key-value

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

假设我进入了 SharedPreferences 文件,并通过用户操作获得了值“英国伦敦”。

现在我想获取与值“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();
    }

最佳答案

您可以使用 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 获取 key 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713321/

相关文章:

java - 如何在 Android Studio 的 Android 应用程序中进行条款和条件 Activity

json - 交换键和值并累加值

scala - 可以在对的 Seq 上更快地实现 reduceByKey 吗?

java - Google protobuf可以用于android中C和Java服务之间的通信吗?

android - 在 friend 的墙上张贴照片?

安卓工作室 0.8.1 : New project and can't preview the L version in the renderer of phones

android - SharedPreferences MODE_PRIVATE 安全

java - 在 TextView 中使用 TypeWriter 动画

android - 无法检索共享的首选项数据

amazon - DynamoDB 是否仍然遵循 CAP 定理及其 "Strong Consistency" promise ?