Збережіть 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.