Сохранить ArrayList в SharedPreferences - PullRequest
290 голосов
/ 14 августа 2011

У меня есть ArrayList с пользовательскими объектами. Каждый пользовательский объект содержит различные строки и числа. Мне нужно, чтобы массив оставался без присмотра, даже если пользователь покидает активность и затем хочет вернуться позже, однако мне не нужен массив, доступный после того, как приложение было полностью закрыто. Таким образом я сохраняю множество других объектов, используя SharedPreferences, но не могу понять, как сохранить весь массив таким образом. Это возможно? Может быть, SharedPreferences не способ пойти по этому поводу? Есть ли более простой способ?

Ответы [ 33 ]

399 голосов
/ 14 августа 2011

После API 11 SharedPreferences Editor принимает Sets.Вы можете преобразовать свой Список в HashSet или что-то подобное и сохранить его таким образом.Когда вы прочитаете его обратно, преобразуйте его в ArrayList, отсортируйте его, если нужно, и все готово.

//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

Вы также можете сериализовать ваш ArrayList и затем сохранить /прочитайте это в / из SharedPreferences.Ниже приведено решение:

РЕДАКТИРОВАТЬ:
Хорошо, ниже приведено решение для сохранения ArrayList в качестве сериализованного объекта в SharedPreferences и последующего чтения его из SharedPreferences.

Поскольку API поддерживает только сохранение и извлечение строк в / из SharedPreferences (после API 11, его проще), мы должны сериализовать и десериализовать объект ArrayList, который имеет список задач, в строку.

В методе addTask() класса TaskManagerApplication мы должны получить экземпляр общего предпочтения и затем сохранить сериализованный ArrayList, используя метод putString():

public void addTask(Task t) {
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
  currentTasks.add(t);

  // save the task list to preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
  Editor editor = prefs.edit();
  try {
    editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
  } catch (IOException e) {
    e.printStackTrace();
  }
  editor.commit();
}

Аналогично, мы должны получитьсписок задач из предпочтения в методе onCreate():

public void onCreate() {
  super.onCreate();
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }

  // load tasks from preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);

  try {
    currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}

Вы можете получить ObjectSerializer класс из проекта Apache Pig ObjectSerializer.java

104 голосов
/ 21 апреля 2014

Использование этого объекта -> TinyDB - Android-Shared-Preferences-Turbo очень просто.

TinyDB tinydb = new TinyDB(context);

поставить

tinydb.putList("MyUsers", mUsersArray);

чтобы получить

tinydb.getList("MyUsers");

UPDATE

Некоторые полезные примеры и способы устранения неполадок можно найти здесь: Общая настройка Android TinyDB функция putListObject

93 голосов
/ 15 июня 2012

Сохранение Array в SharedPreferences:

public static boolean saveArray()
{
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor mEdit1 = sp.edit();
    /* sKey is an array */
    mEdit1.putInt("Status_size", sKey.size());  

    for(int i=0;i<sKey.size();i++)  
    {
        mEdit1.remove("Status_" + i);
        mEdit1.putString("Status_" + i, sKey.get(i));  
    }

    return mEdit1.commit();     
}

Загрузка Array Данные из SharedPreferences

public static void loadArray(Context mContext)
{  
    SharedPreferences mSharedPreference1 =   PreferenceManager.getDefaultSharedPreferences(mContext);
    sKey.clear();
    int size = mSharedPreference1.getInt("Status_size", 0);  

    for(int i=0;i<size;i++) 
    {
     sKey.add(mSharedPreference1.getString("Status_" + i, null));
    }

}
59 голосов
/ 14 августа 2011

Вы можете преобразовать его в JSON String и сохранить строку в SharedPreferences.

42 голосов
/ 10 января 2015

Как сказал @nirav, лучшее решение - сохранить его в sharedPrefernces в виде текста json с помощью служебного класса Gson.Ниже пример кода:

//Retrieve the values
Gson gson = new Gson();
String jsonText = Prefs.getString("key", null);
String[] text = gson.fromJson(jsonText, String[].class);  //EDIT: gso to gson


//Set the values
Gson gson = new Gson();
List<String> textList = new ArrayList<String>();
textList.addAll(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();
21 голосов
/ 26 апреля 2016

Привет, друзья! Я получил решение вышеуказанной проблемы без использования библиотеки Gson. Здесь я размещаю исходный код.

1. Переменная декларация, т. Е.

  SharedPreferences shared;
  ArrayList<String> arrPackage;

2. Переменная инициализация, т. Е.

 shared = getSharedPreferences("App_settings", MODE_PRIVATE);
 // add values for your ArrayList any where...
 arrPackage = new ArrayList<>();

3. Сохраните значение для sharedPreference, используя packagesharedPreferences():

 private void packagesharedPreferences() {
   SharedPreferences.Editor editor = shared.edit();
   Set<String> set = new HashSet<String>();
   set.addAll(arrPackage);
   editor.putStringSet("DATE_LIST", set);
   editor.apply();
   Log.d("storesharedPreferences",""+set);
 }

4. Получить значение sharedPreference, используя retriveSharedValue():

 private void retriveSharedValue() {
   Set<String> set = shared.getStringSet("DATE_LIST", null);
   arrPackage.addAll(set);
   Log.d("retrivesharedPreferences",""+set);
 }

Надеюсь, это поможет вам ...

13 голосов
/ 23 марта 2016

Android SharedPreferances позволяет вам сохранять примитивные типы (Boolean, Float, Int, Long, String и StringSet, доступные с API11) в памяти в виде XML-файла.

Ключевой идеей любого решения будет преобразование данных в один из этих примитивных типов.

Мне лично нравится преобразовывать мой список в формат json, а затем сохранять его как строку в значении SharedPreferences.

Чтобы использовать мое решение, вам нужно добавить Google Gson lib.

В Gradle просто добавьте следующую зависимость (пожалуйста, используйте последнюю версию Google):

compile 'com.google.code.gson:gson:2.6.2'

Сохранить данные (где HttpParam - ваш объект):

List<HttpParam> httpParamList = "**get your list**"
String httpParamJSONList = new Gson().toJson(httpParamList);

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(**"your_prefes_key"**, httpParamJSONList);

editor.apply();

Получение данных (где HttpParam - ваш объект):

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
String httpParamJSONList = prefs.getString(**"your_prefes_key"**, ""); 

List<HttpParam> httpParamList =  
new Gson().fromJson(httpParamJSONList, new TypeToken<List<HttpParam>>() {
            }.getType());
8 голосов
/ 05 сентября 2014

Вы также можете преобразовать массив в строку и сохранить его в предпочтении

private String convertToString(ArrayList<String> list) {

            StringBuilder sb = new StringBuilder();
            String delim = "";
            for (String s : list)
            {
                sb.append(delim);
                sb.append(s);;
                delim = ",";
            }
            return sb.toString();
        }

private ArrayList<String> convertToArray(String string) {

            ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(",")));
            return list;
        }

Вы можете сохранить Arraylist после преобразования его в строку, используя метод convertToString, получить строку и преобразовать ее в массив, используя convertToArray

.

После API 11 вы можете сохранить настройки прямо в SharedPreferences , хотя !!! :)

8 голосов
/ 04 декабря 2018

Это ваше идеальное решение .. попробуйте,

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();     // This line is IMPORTANT !!!
}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}
5 голосов
/ 30 декабря 2016

Я прочитал все ответы выше. Это все правильно, но я нашел более простое решение, как показано ниже:

  1. Сохранение списка строк в общих настройках >>

    public static void setSharedPreferenceStringList(Context pContext, String pKey, List<String> pData) {
    SharedPreferences.Editor editor = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
    editor.putInt(pKey + "size", pData.size());
    editor.commit();
    
    for (int i = 0; i < pData.size(); i++) {
        SharedPreferences.Editor editor1 = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
        editor1.putString(pKey + i, (pData.get(i)));
        editor1.commit();
    }
    

    }

  2. и для получения списка строк из общих настроек >>

    public static List<String> getSharedPreferenceStringList(Context pContext, String pKey) {
    int size = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getInt(pKey + "size", 0);
    List<String> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
        list.add(pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getString(pKey + i, ""));
    }
    return list;
    }
    

Здесь Constants.APP_PREFS - имя файла, который нужно открыть; не может содержать разделители пути.

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