Збережіть ArrayList до SharedPreferences


317

У мене є ArrayListспеціальні об'єкти. Кожен спеціальний об'єкт містить різноманітні рядки та числа. Мені потрібен масив, щоб закріпитися, навіть якщо користувач покине активність, а потім хоче повернутися пізніше, проте мені не потрібен масив, доступний після повного закриття програми. Таким чином я зберігаю безліч інших об'єктів, SharedPreferencesале не можу зрозуміти, як зберегти весь масив таким чином. Чи можливо це? Може, SharedPreferencesце не спосіб зробити це? Чи є простіший метод?


Ви можете знайти відповідь тут: stackoverflow.com/questions/14981233 / ...
Apurva Kolapkar

це повний приклад йдуть через URL - адреса stackoverflow.com/a/41137562/4344659
Санджив Sangral

Якщо хтось шукає рішення, це може бути відповідь, яку ви шукаєте з прикладом повного використання в kotlin. stackoverflow.com/a/56873719/3710341
Сагар Chapagain

Відповіді:


431

Після 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. Нижче наведено рішення:

EDIT:
Гаразд, нижче - рішення зберегти 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


21
Майте на увазі, що putStringSetдодано в API 11. Більшість нинішніх програмістів орієнтуються на оренду API 8 (Froyo).
Крістіан

2
Мені подобається ідея цього методу, тому що він, здається, є найчистішим, але масив, який я хочу зберігати, - це об'єкт спеціального класу, який містить рядки, подвійні і булеві. Як я можу додати всі 3 цих типу до набору? Чи потрібно встановлювати кожен окремий об'єкт у свій власний масив, а потім додавати їх окремо до окремих наборів, перш ніж зберігати, чи є більш простий спосіб?
ryandlf

5
Що таке scoreEditor?
Ручір Баронія

2
Читачам після жовтня 2016 року: Цей коментар вже отримує багато відгуків, і ви можете використовувати його як я, але будь ласка, зупиняйте і не робіть цього. HashSet відкине повторюване значення, таким чином ваш ArrayList не буде однаковим. Деталі тут: stackoverflow.com/questions/12940663/…
seoul

2
Як нагадування тим, хто стикається з цією відповіддю: Набір не упорядкований, тому збереження StringSet втратить порядок, який ви мали у своєму ArrayList.
Девід Лю

119

Використовуючи цей об'єкт -> TinyDB - Android-Shared-Preferences-Turbo його дуже просто.

TinyDB tinydb = new TinyDB(context);

покласти

tinydb.putList("MyUsers", mUsersArray);

отримати

tinydb.getList("MyUsers");

ОНОВЛЕННЯ

Тут можна знайти кілька корисних прикладів та усунення несправностей: Android Shared Preference TinyDB putListObject frunction


6
Це найкращий підхід. +1 з мого боку
Срітам Ягадев

3
Я також. Надзвичайно корисно !!
Хуан Агілар Гісадо

1
залежно від вмісту вашого Списку, вам потрібно вказати тип об'єкта вашого списку при виклику tinydb.putList()Подивіться приклади на пов’язаній сторінці.
kc ochibili

хороша вкладка, але я повинен зазначити, що іноді ця бібліотека має проблеми при зберіганні об'єктів. якщо бути більш конкретним, він може кинути виняток переповнення стека. і я думаю, це тому, що він використовує роздуми, щоб з'ясувати, як зберігати об'єкт, і якщо об'єкт стає занадто складним, він може викинути цей виняток.
Mr.Q

1
Люблю тебе так сильно!
mychemicalro

93

Збереження 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));
    }

}

14
це дуже приємний "хак". Майте на увазі, що за допомогою цього методу завжди існує можливість роздуття SharedPreferences з невикористаними старими значеннями. Наприклад, список може мати розмір 100 під час пробігу, а потім розмір 50. 50 старих записів залишаться у налаштуваннях. Один із способів - це встановити значення MAX і очистити що-небудь до цього.
Іракліс

3
@Iraklis Дійсно, але якщо припустити, що ви зберігаєте лише це ArrayListу SharedPrefenecesвас, ви можете використати, mEdit1.clear()щоб цього уникнути.
AlexAndro

1
Мені подобається цей «хак». Але mEdit1.clear () видалить інші значення, не пов'язані з цією метою?
Bagusflyer

1
Дякую! Якщо ви заперечуєте, щоб запитати, чи є необхідна мета для .remove ()? Чи не вдасться все-таки просто замінити перевагу?
Сценарій Кітті

62

Ви можете конвертувати його JSON Stringі зберігати рядок у SharedPreferences.


Я знаходжу тону коду при перетворенні ArrayLists в JSONArrays, але чи є у вас зразок, який ви могли б поділитися тим, як перетворити на JSONString, щоб я міг зберігати його у SharedPrefs?
ryandlf

5
використовуючи toString ()
MByD

3
Але тоді як я можу повернути його з SharedPrefs і перетворити його назад у ArrayList?
ryandlf

Вибачте, у мене немає SDK для Android, щоб перевірити його зараз, але подивіться тут: benjii.me/2010/04/deserializing-json-in-android-using-gson . Вам слід повторити масив json і робити те, що вони там роблять для кожного об'єкта, сподіваюсь, завтра я зможу опублікувати редагування своєї відповіді з повним прикладом.
MByD

53

Як сказав @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();

2
Слава Богу, це було рятівником життя. Насправді дуже просто.
Парфібан М

2
Ця відповідь повинна бути вгору. Чудово! Не мав уявлення, що я можу використовувати Гсон таким чином. Перший раз, щоб побачити позначення масиву, використовувався і цей спосіб. Дякую!
мад

3
Щоб перетворити його назад у Список, Список <String> textList = Arrays.asList (gson.fromJson (jsonText, String []. Class));
Vamsi Challa

22

Привіт друзі, я вирішив вищезазначену проблему, не використовуючи 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);
 }

Я сподіваюся, що це стане в нагоді для вас ...


чудове рішення! легко і швидко!
LoveAndroid

5
Це видалить усі повторювані рядки зі списку, як тільки ви додасте до набору. Можливо, не потрібна функція
OneCricketeer

Це лише для списку Strings?
CoolMind

Ви втратите порядок таким чином
Брайан Райнхолд

16
/**
 *     Save and get ArrayList in SharedPreference
 */

JAVA:

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();    

}

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);
}

Котлін

fun saveArrayList(list: java.util.ArrayList<String?>?, key: String?) {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val editor: Editor = prefs.edit()
    val gson = Gson()
    val json: String = gson.toJson(list)
    editor.putString(key, json)
    editor.apply()
}

fun getArrayList(key: String?): java.util.ArrayList<String?>? {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val gson = Gson()
    val json: String = prefs.getString(key, null)
    val type: Type = object : TypeToken<java.util.ArrayList<String?>?>() {}.getType()
    return gson.fromJson(json, type)
}

1
Так, найкраща відповідь
AlexPad

це найкраща відповідь, я використовував його і для зберігання інших об’єктів
Ірфанді Д. Венді,

Ви можете зробити це, це означає, що він буде зберігати весь клас моделі?
BlackBlind

13

Android SharedPreferances дозволяє зберігати примітивні типи (Boolean, Float, Int, Long, String і StringSet, які доступні з API11) у пам'яті у вигляді файлу xml.

Ключовою ідеєю будь-якого рішення було б перетворення даних в один із цих примітивних типів.

Я особисто люблю конвертувати мій список у формат json, а потім зберігати його як String у значенні SharedPreferences.

Для того, щоб використовувати моє рішення, вам доведеться додати lib Gson Google .

У 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());

Дякую. Ця відповідь допомогла мені знайти та зберегти мій Список <MyObject>.
visrahane

Дякую.
Відмінно

11

Це ваше ідеальне рішення. Спробуйте,

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);
}

9

Ви також можете перетворити масив архіву в String і зберегти його в налаштуваннях

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 !!! :)


6

Для String, int, boolean найкращим вибором будуть спільні параметри.

Якщо ви хочете зберігати ArrayList або будь-які складні дані. Найкращим вибором буде Паперова бібліотека.

Додайте залежність

implementation 'io.paperdb:paperdb:2.6'

Ініціалізувати папір

Слід ініціалізувати один раз у Application.onCreate ():

Paper.init(context);

Зберегти

List<Person> contacts = ...
Paper.book().write("contacts", contacts);

Завантаження даних

Використовуйте значення за замовчуванням, якщо об’єкт не існує у сховищі.

List<Person> contacts = Paper.book().read("contacts", new ArrayList<>());

Ось ви йдете.

https://github.com/pilgr/Paper


5

Я прочитав усі відповіді вище. Це все правильно, але я знайшов більш легке рішення, як показано нижче:

  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назва файлу, який потрібно відкрити; не може містити роздільники шляхів.


5

Також з Котліном:

fun SharedPreferences.Editor.putIntegerArrayList(key: String, list: ArrayList<Int>?): SharedPreferences.Editor {
    putString(key, list?.joinToString(",") ?: "")
    return this
}

fun SharedPreferences.getIntegerArrayList(key: String, defValue: ArrayList<Int>?): ArrayList<Int>? {
    val value = getString(key, null)
    if (value.isNullOrBlank())
        return defValue
    return ArrayList (value.split(",").map { it.toInt() }) 
}

4

Найкращий спосіб - перетворити в рядок JSOn за допомогою GSON і зберегти цю рядок у SharedPreference. Я також використовую цей спосіб для кешування відповідей.


4

Ви можете зберегти список рядків та спеціальних масивів за допомогою бібліотеки Gson.

=> Спочатку потрібно створити функцію для збереження списку масивів до SharedPreferences.

public void saveListInLocal(ArrayList<String> list, String key) {

        SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        editor.putString(key, json);
        editor.apply();     // This line is IMPORTANT !!!

    }

=> Вам потрібно створити функцію, щоб отримати список масивів із SharedPreferences.

public ArrayList<String> getListFromLocal(String key)
{
    SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);

}

=> Як викликати збереження та отримання функції списку масивів.

ArrayList<String> listSave=new ArrayList<>();
listSave.add("test1"));
listSave.add("test2"));
saveListInLocal(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<String> listGet=new ArrayList<>();
listGet=getListFromLocal("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());

=> Не забудьте додати бібліотеку gson у свій додаток build.gradle.

реалізація 'com.google.code.gson: gson: 2.8.2'


3

Ви можете передати функції serializeKey () та deserializeKey () з класу SharedPreferencesTokenCache FacebookSDK. Він перетворює підтримуваний тип в об'єкт JSON і зберігає рядок JSON в SharedPreferences . Ви можете завантажити SDK звідси

private void serializeKey(String key, Bundle bundle, SharedPreferences.Editor editor)
    throws JSONException {
    Object value = bundle.get(key);
    if (value == null) {
        // Cannot serialize null values.
        return;
    }

    String supportedType = null;
    JSONArray jsonArray = null;
    JSONObject json = new JSONObject();

    if (value instanceof Byte) {
        supportedType = TYPE_BYTE;
        json.put(JSON_VALUE, ((Byte)value).intValue());
    } else if (value instanceof Short) {
        supportedType = TYPE_SHORT;
        json.put(JSON_VALUE, ((Short)value).intValue());
    } else if (value instanceof Integer) {
        supportedType = TYPE_INTEGER;
        json.put(JSON_VALUE, ((Integer)value).intValue());
    } else if (value instanceof Long) {
        supportedType = TYPE_LONG;
        json.put(JSON_VALUE, ((Long)value).longValue());
    } else if (value instanceof Float) {
        supportedType = TYPE_FLOAT;
        json.put(JSON_VALUE, ((Float)value).doubleValue());
    } else if (value instanceof Double) {
        supportedType = TYPE_DOUBLE;
        json.put(JSON_VALUE, ((Double)value).doubleValue());
    } else if (value instanceof Boolean) {
        supportedType = TYPE_BOOLEAN;
        json.put(JSON_VALUE, ((Boolean)value).booleanValue());
    } else if (value instanceof Character) {
        supportedType = TYPE_CHAR;
        json.put(JSON_VALUE, value.toString());
    } else if (value instanceof String) {
        supportedType = TYPE_STRING;
        json.put(JSON_VALUE, (String)value);
    } else {
        // Optimistically create a JSONArray. If not an array type, we can null
        // it out later
        jsonArray = new JSONArray();
        if (value instanceof byte[]) {
            supportedType = TYPE_BYTE_ARRAY;
            for (byte v : (byte[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof short[]) {
            supportedType = TYPE_SHORT_ARRAY;
            for (short v : (short[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof int[]) {
            supportedType = TYPE_INTEGER_ARRAY;
            for (int v : (int[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof long[]) {
            supportedType = TYPE_LONG_ARRAY;
            for (long v : (long[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof float[]) {
            supportedType = TYPE_FLOAT_ARRAY;
            for (float v : (float[])value) {
                jsonArray.put((double)v);
            }
        } else if (value instanceof double[]) {
            supportedType = TYPE_DOUBLE_ARRAY;
            for (double v : (double[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof boolean[]) {
            supportedType = TYPE_BOOLEAN_ARRAY;
            for (boolean v : (boolean[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof char[]) {
            supportedType = TYPE_CHAR_ARRAY;
            for (char v : (char[])value) {
                jsonArray.put(String.valueOf(v));
            }
        } else if (value instanceof List<?>) {
            supportedType = TYPE_STRING_LIST;
            @SuppressWarnings("unchecked")
            List<String> stringList = (List<String>)value;
            for (String v : stringList) {
                jsonArray.put((v == null) ? JSONObject.NULL : v);
            }
        } else {
            // Unsupported type. Clear out the array as a precaution even though
            // it is redundant with the null supportedType.
            jsonArray = null;
        }
    }

    if (supportedType != null) {
        json.put(JSON_VALUE_TYPE, supportedType);
        if (jsonArray != null) {
            // If we have an array, it has already been converted to JSON. So use
            // that instead.
            json.putOpt(JSON_VALUE, jsonArray);
        }

        String jsonString = json.toString();
        editor.putString(key, jsonString);
    }
}

private void deserializeKey(String key, Bundle bundle)
        throws JSONException {
    String jsonString = cache.getString(key, "{}");
    JSONObject json = new JSONObject(jsonString);

    String valueType = json.getString(JSON_VALUE_TYPE);

    if (valueType.equals(TYPE_BOOLEAN)) {
        bundle.putBoolean(key, json.getBoolean(JSON_VALUE));
    } else if (valueType.equals(TYPE_BOOLEAN_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        boolean[] array = new boolean[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getBoolean(i);
        }
        bundle.putBooleanArray(key, array);
    } else if (valueType.equals(TYPE_BYTE)) {
        bundle.putByte(key, (byte)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_BYTE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        byte[] array = new byte[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (byte)jsonArray.getInt(i);
        }
        bundle.putByteArray(key, array);
    } else if (valueType.equals(TYPE_SHORT)) {
        bundle.putShort(key, (short)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_SHORT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        short[] array = new short[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (short)jsonArray.getInt(i);
        }
        bundle.putShortArray(key, array);
    } else if (valueType.equals(TYPE_INTEGER)) {
        bundle.putInt(key, json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_INTEGER_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int[] array = new int[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getInt(i);
        }
        bundle.putIntArray(key, array);
    } else if (valueType.equals(TYPE_LONG)) {
        bundle.putLong(key, json.getLong(JSON_VALUE));
    } else if (valueType.equals(TYPE_LONG_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        long[] array = new long[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getLong(i);
        }
        bundle.putLongArray(key, array);
    } else if (valueType.equals(TYPE_FLOAT)) {
        bundle.putFloat(key, (float)json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_FLOAT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        float[] array = new float[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (float)jsonArray.getDouble(i);
        }
        bundle.putFloatArray(key, array);
    } else if (valueType.equals(TYPE_DOUBLE)) {
        bundle.putDouble(key, json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_DOUBLE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        double[] array = new double[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getDouble(i);
        }
        bundle.putDoubleArray(key, array);
    } else if (valueType.equals(TYPE_CHAR)) {
        String charString = json.getString(JSON_VALUE);
        if (charString != null && charString.length() == 1) {
            bundle.putChar(key, charString.charAt(0));
        }
    } else if (valueType.equals(TYPE_CHAR_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        char[] array = new char[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            String charString = jsonArray.getString(i);
            if (charString != null && charString.length() == 1) {
                array[i] = charString.charAt(0);
            }
        }
        bundle.putCharArray(key, array);
    } else if (valueType.equals(TYPE_STRING)) {
        bundle.putString(key, json.getString(JSON_VALUE));
    } else if (valueType.equals(TYPE_STRING_LIST)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int numStrings = jsonArray.length();
        ArrayList<String> stringList = new ArrayList<String>(numStrings);
        for (int i = 0; i < numStrings; i++) {
            Object jsonStringValue = jsonArray.get(i);
            stringList.add(i, jsonStringValue == JSONObject.NULL ? null : (String)jsonStringValue);
        }
        bundle.putStringArrayList(key, stringList);
    }
}

2

Чому ви не приклеюєте свій арселіст до класу Application? Він руйнується лише тоді, коли додаток дійсно вбито, тож він буде триматися довгий час, поки додаток буде доступний.


5
Що робити, якщо програму знову перезапустити.
Манохар Перепа

2

Найкращий спосіб, який мені вдалося знайти, - це зробити двомірний масив ключів і помістити спеціальні елементи масиву у двовимірний масив клавіш, а потім отримати його через 2D масив при запуску. Мені не сподобалася ідея використовувати набір струн, тому що більшість користувачів Android все ще перебувають на пряниках, а для використання набору струн потрібна сота.

Приклад коду: тут ditor - це спільний редактор pref, а rowitem - мій спеціальний об'єкт.

editor.putString(genrealfeedkey[j][1], Rowitemslist.get(j).getname());
        editor.putString(genrealfeedkey[j][2], Rowitemslist.get(j).getdescription());
        editor.putString(genrealfeedkey[j][3], Rowitemslist.get(j).getlink());
        editor.putString(genrealfeedkey[j][4], Rowitemslist.get(j).getid());
        editor.putString(genrealfeedkey[j][5], Rowitemslist.get(j).getmessage());

2

наступний код - це прийнята відповідь, ще кілька рядків для нових людей (я), наприклад. показує, як перетворити об'єкт набору типів назад у arrayList, та додаткові вказівки щодо того, що передує '.putStringSet' та '.getStringSet'. (дякую evilone)

// shared preferences
   private SharedPreferences preferences;
   private SharedPreferences.Editor nsuserdefaults;

// setup persistent data
        preferences = this.getSharedPreferences("MyPreferences", MainActivity.MODE_PRIVATE);
        nsuserdefaults = preferences.edit();

        arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        //Retrieve followers from sharedPreferences
        Set<String> set = preferences.getStringSet("following", null);

        if (set == null) {
            // lazy instantiate array
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        } else {
            // there is data from previous run
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<>(set);
        }

// convert arraylist to set, and save arrayOfMemberUrlsUserIsFollowing to nsuserdefaults
                Set<String> set = new HashSet<String>();
                set.addAll(arrayOfMemberUrlsUserIsFollowing);
                nsuserdefaults.putStringSet("following", set);
                nsuserdefaults.commit();

2
//Set the values
intent.putParcelableArrayListExtra("key",collection);

//Retrieve the values
ArrayList<OnlineMember> onlineMembers = data.getParcelableArrayListExtra("key");


2

Ви можете використовувати серіалізацію або бібліотеку Gson для перетворення списку в рядок і навпаки, а потім зберегти рядок у налаштуваннях.

Використання бібліотеки Gson google:

//Converting list to string
new Gson().toJson(list);

//Converting string to list
new Gson().fromJson(listString, CustomObjectsList.class);

Використання серіалізації Java:

//Converting list to string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(list);
oos.flush();
String string = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
oos.close();
bos.close();
return string;

//Converting string to list
byte[] bytesArray = Base64.decode(familiarVisitsString, Base64.DEFAULT);
ByteArrayInputStream bis = new ByteArrayInputStream(bytesArray);
ObjectInputStream ois = new ObjectInputStream(bis);
Object clone = ois.readObject();
ois.close();
bis.close();
return (CustomObjectsList) clone;

2

Цей метод використовується для зберігання / збереження списку масивів: -

 public static void saveSharedPreferencesLogList(Context context, List<String> collageList) {
            SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
            SharedPreferences.Editor prefsEditor = mPrefs.edit();
            Gson gson = new Gson();
            String json = gson.toJson(collageList);
            prefsEditor.putString("myJson", json);
            prefsEditor.commit();
        }

Цей метод використовується для отримання списку масивів: -

public static List<String> loadSharedPreferencesLogList(Context context) {
        List<String> savedCollage = new ArrayList<String>();
        SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = mPrefs.getString("myJson", "");
        if (json.isEmpty()) {
            savedCollage = new ArrayList<String>();
        } else {
            Type type = new TypeToken<List<String>>() {
            }.getType();
            savedCollage = gson.fromJson(json, type);
        }

        return savedCollage;
    }

1

Ви можете перетворити його в MapОб'єкт для зберігання, а потім змінити значення назад у ArrayList, коли ви отримаєте SharedPreferences.


1

Використовуйте цей спеціальний клас:

public class SharedPreferencesUtil {

    public static void pushStringList(SharedPreferences sharedPref, 
                                      List<String> list, String uniqueListName) {

        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(uniqueListName + "_size", list.size());

        for (int i = 0; i < list.size(); i++) {
            editor.remove(uniqueListName + i);
            editor.putString(uniqueListName + i, list.get(i));
        }
        editor.apply();
    }

    public static List<String> pullStringList(SharedPreferences sharedPref, 
                                              String uniqueListName) {

        List<String> result = new ArrayList<>();
        int size = sharedPref.getInt(uniqueListName + "_size", 0);

        for (int i = 0; i < size; i++) {
            result.add(sharedPref.getString(uniqueListName + i, null));
        }
        return result;
    }
}

Як користуватись:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferencesUtil.pushStringList(sharedPref, list, getString(R.string.list_name));
List<String> list = SharedPreferencesUtil.pullStringList(sharedPref, getString(R.string.list_name));

1

це має працювати:

public void setSections (Context c,  List<Section> sectionList){
    this.sectionList = sectionList;

    Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
    String sectionListString = new Gson().toJson(sectionList,sectionListType);

    SharedPreferences.Editor editor = getSharedPreferences(c).edit().putString(PREFS_KEY_SECTIONS, sectionListString);
    editor.apply();
}

їх, щоб зловити це просто:

public List<Section> getSections(Context c){

    if(this.sectionList == null){
        String sSections = getSharedPreferences(c).getString(PREFS_KEY_SECTIONS, null);

        if(sSections == null){
            return new ArrayList<>();
        }

        Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
        try {

            this.sectionList = new Gson().fromJson(sSections, sectionListType);

            if(this.sectionList == null){
                return new ArrayList<>();
            }
        }catch (JsonSyntaxException ex){

            return new ArrayList<>();

        }catch (JsonParseException exc){

            return new ArrayList<>();
        }
    }
    return this.sectionList;
}

це працює для мене.


1

Мій утилітний клас для збереження списку до SharedPreferences

public class SharedPrefApi {
    private SharedPreferences sharedPreferences;
    private Gson gson;

    public SharedPrefApi(Context context, Gson gson) {
        this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        this.gson = gson;
    } 

    ...

    public <T> void putList(String key, List<T> list) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, gson.toJson(list));
        editor.apply();
    }

    public <T> List<T> getList(String key, Class<T> clazz) {
        Type typeOfT = TypeToken.getParameterized(List.class, clazz).getType();
        return gson.fromJson(getString(key, null), typeOfT);
    }
}

Використання

// for save
sharedPrefApi.putList(SharedPrefApi.Key.USER_LIST, userList);

// for retrieve
List<User> userList = sharedPrefApi.getList(SharedPrefApi.Key.USER_LIST, User.class);

.
Повний код моїх утиліт // перевірити за допомогою прикладу в коді діяльності


1

Я використовував той самий спосіб збереження та отримання рядка, але тут з arrayList я використовував HashSet як посередник

Для збереження arrayList до SharedPreferences ми використовуємо HashSet:

1- ми створюємо змінну SharedPreferences (на місці зміни, яка відбувається з масивом)

2 - ми перетворюємо arrayList в HashSet

3 - потім ставимо stringSet і застосовуємо

4 - ви отримуєтеStringSet в HashSet і відтворюєте ArrayList для встановлення HashSet.

public class MainActivity extends AppCompatActivity {
    ArrayList<String> arrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE);

        HashSet<String> set = new HashSet(arrayList);
        prefs.edit().putStringSet("names", set).apply();


        set = (HashSet<String>) prefs.getStringSet("names", null);
        arrayList = new ArrayList(set);

        Log.i("array list", arrayList.toString());
    }
}

0
    public  void saveUserName(Context con,String username)
    {
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            usernameEditor = usernameSharedPreferences.edit();
            usernameEditor.putInt(PREFS_KEY_SIZE,(USERNAME.size()+1)); 
            int size=USERNAME.size();//USERNAME is arrayList
            usernameEditor.putString(PREFS_KEY_USERNAME+size,username);
            usernameEditor.commit();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    public void loadUserName(Context con)
    {  
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            size=usernameSharedPreferences.getInt(PREFS_KEY_SIZE,size);
            USERNAME.clear();
            for(int i=0;i<size;i++)
            { 
                String username1="";
                username1=usernameSharedPreferences.getString(PREFS_KEY_USERNAME+i,username1);
                USERNAME.add(username1);
            }
            usernameArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, USERNAME);
            username.setAdapter(usernameArrayAdapter);
            username.setThreshold(0);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

0

Усі вищезазначені відповіді правильні. :) Я сам використовував одне із таких для своєї ситуації. Однак, прочитавши питання, я виявив, що ОП насправді говорить про інший сценарій, ніж назва цієї посади, якщо я не зрозумів це неправильно.

"Мені потрібен масив, щоб триматися навколо, навіть якщо користувач покидає діяльність, а потім хоче повернутися пізніше"

Він насправді хоче, щоб дані зберігалися до тих пір, поки програма не буде відкрита, незалежно від екранів, що змінюються користувачем у програмі.

"однак мені не потрібен масив, доступний після того, як програма повністю закрита"

Але після закриття програми дані не зберігаються. Тому я відчуваю, що я користуюся SharedPreferences не є оптимальним способом цього.

Що можна зробити для цієї вимоги - створити клас, який розширює Applicationклас.

public class MyApp extends Application {

    //Pardon me for using global ;)

    private ArrayList<CustomObject> globalArray;

    public void setGlobalArrayOfCustomObjects(ArrayList<CustomObject> newArray){
        globalArray = newArray; 
    }

    public ArrayList<CustomObject> getGlobalArrayOfCustomObjects(){
        return globalArray;
    }

}

За допомогою програми та getter до ArrayList можна отримати доступ з будь-якого місця за допомогою програми. І найкраще, що коли програма закрита, нам не потрібно турбуватися про збереження даних. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.