3

ペアになっている「値」の値がわかっている場合、SharedPreferencesファイルから「キー」の値を取得することはできますか?

SharedPreferencesファイルにアクセスし、ユーザーアクションを通じて、値「London、UK」を取得したとします。

次に、値「London、UK」に関連付けられたKEYを取得し、それを次のステップに使用します。これは可能ですか?

SharedPerferencesからAllデータを取得し、値で並べ替え、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();
    }
4

2 に答える 2

10

メソッドを使用できます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 で一意であることが保証されていますが、値が一意であるという保証はないことに注意してください。そのため、この関数は最初に一致した値のキーのみを返します。

于 2012-10-03T17:09:34.800 に答える
0

あなたが試すことができます:

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
    }

そのマップを繰り返し処理して、必要な値を探すことができます。

于 2012-10-03T17:08:32.847 に答える