Android SharedPreferences.Editor метод putStringSet недоступен - PullRequest
2 голосов
/ 21 июля 2011

Я пытаюсь обновить созданный мной генератор паролей, чтобы включить возможность сохранять пароли, поэтому я использую SharedPreferences. Я хочу поместить сохраненные пароли в набор, но когда я пытаюсь сохранить набор с помощью метода putStringSet SharedPreferences.Editor, Eclipse не распознает его. Когда я наведите курсор мыши на putStringSet в своем коде, доступны 2 быстрых исправления: «Изменить на putString (...)» и «Добавить приведение к редактору», но я не думаю, что какая-либо из этих подсказок помогает.

Вот что у меня есть:

public void save(View v)
{
    SharedPreferences prefs = getPreferences(MODE_PRIVATE);
    final SharedPreferences.Editor editor = prefs.edit();
    savedPasswords = (Set<String>) getSharedPreferences("savedPasswordsList", 0);
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setItems(passwords, new DialogInterface.OnClickListener(){
        public void onClick(DialogInterface face, int num)
        {
            savedPasswords.add(passwords[num]);
            editor.putStringSet("savedPasswordsList", savedPasswords);
            editor.commit();
            refreshSavedPasswordsList();
        }
    });
    dialog.show();
}

Ответы [ 4 ]

7 голосов
/ 21 июля 2011

putStringSet(...) был добавлен в API 11 (Android v3.0.x и далее).Я предполагаю, что вы ориентируетесь на версию ниже этой.

2 голосов
/ 03 июля 2013

Я реализовал хранилище данных с помощью putStringSet, а затем мне нужно было перенести его обратно в Gingerbread, поэтому я создал небольшой класс с именем JSONSharedPreferences.

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.SharedPreferences;


    public class JSONSharedPreferences {
      private static final String PREFIX = "json";

        public static void saveJSONObject(SharedPreferences prefs, String key, JSONObject object) {
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(JSONSharedPreferences.PREFIX+key, object.toString());
            editor.commit();
        }

        public static void saveJSONArray(SharedPreferences prefs, String key, JSONArray array) {
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(JSONSharedPreferences.PREFIX+key, array.toString());
            editor.commit();
        }

        public static JSONObject loadJSONObject(SharedPreferences prefs, String key) throws JSONException {
            return new JSONObject(prefs.getString(JSONSharedPreferences.PREFIX+key, "{}"));
        }

        public static JSONArray loadJSONArray(SharedPreferences prefs, String key) throws JSONException {
            return new JSONArray(prefs.getString(JSONSharedPreferences.PREFIX+key, "[]"));
        }

        public static void remove(SharedPreferences prefs, String key) {
            if (prefs.contains(JSONSharedPreferences.PREFIX+key)) {
                SharedPreferences.Editor editor = prefs.edit();
                editor.remove(JSONSharedPreferences.PREFIX+key);
                editor.commit();
            }
        }
    }

Использование:

//Below, the code to use putStringSet is commented out. 
//Alternative JSONSharedPreferences is used instead 

//Set<String> trainers = new TreeSet<String>();     
JSONArray jTrainers = new JSONArray();
List<FilteredWorkoutVideo> videos = getAllFilteredVideos(prefs);
for (FilteredWorkoutVideo video : videos) {
    //trainers.add(video.getTrainerName()); 
  jTrainers.put(video.getTrainerName());
}

//e = prefs.edit();
//e.putStringSet(Constants.KEY_ALL_TRAINERS, trainers);
//e.apply();
JSONSharedPreferences.saveJSONArray(prefs, Constants.KEY_ALL_TRAINERS, jTrainers);
1 голос
/ 13 августа 2014

Чтобы обойти эту проблему, я создал класс SharedPreferencesCompat:

В хранилище StringSet в виде строки CSV .

Можно изменить "," используемый в CVS другим разделителем.

public class SharedPreferencesCompat {

  private final static String KEY_DELIMITER = "com.example.delimiter";

  public static void setStringSetDelimiter(final SharedPreferences sharedPreferences, final String delimiter) {
      final Editor editor = sharedPreferences.edit();
      editor.putString(KEY_DELIMITER, delimiter);
      editor.commit();
  }

  public static Set<String> getStringSet(final SharedPreferences sharedPreferences, final String key) {
      final Set<String> out = new LinkedHashSet<String>();
      final String base = sharedPreferences.getString(key, null);
      if (base != null) {
          out.addAll(Arrays.asList(base.split(sharedPreferences.getString(KEY_DELIMITER, ","))));
      }
      return out;
  }

  public static void putStringSet(final SharedPreferences sharedPreferences, final String key,
        final Set<String> stringSet) {
      final String concat = StringUtils.join(stringSet, sharedPreferences.getString(KEY_DELIMITER, ","));
      final Editor editor = sharedPreferences.edit();
      editor.putString(key, concat);
      editor.commit();
  }
}

Примечание :

Это зависит от apache StringUtils.Метод join ().

Вы можете легко поменять его на другой.

0 голосов
/ 09 апреля 2013

Я знаю, что этот поток старый, но я столкнулся с той же проблемой, и я решил использовать глобальную HashTable для отслеживания моих строк, которые на самом деле были именами файлов. Мне также нужен был статус, связанный с каждым файлом, поэтому я реализовал следующий простой класс:

    public class Globals
    {
        public static enum SendStatus
        {
            NOT_SENT,
            SEND_SUCCESS,
            SEND_ERROR
        }

        public static volatile Hashtable<String, SendStatus> StoredFilesStatus;

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...