Android SharedPrefences несколько значений для одного ключа - PullRequest
0 голосов
/ 27 июня 2018

У меня проблема здесь.

Я не знаю, как прочитать все значения SharedPreferences для одного конкретного ключа. На самом деле я пытаюсь написать Arraylist в настройках, а затем прочитать его.

Позвольте мне объяснить с некоторым кодом, Вот мои методы для записи в настройках:

fun writeArrayOnPreferences(key: String?, array: ArrayList<String>, c:Context) {
        val preferences = c.getSharedPreferences(
                c.getString(key), Context.MODE_PRIVATE)
        with(preferences.edit()) {
            for (value in array) {
                putString(key, value)
            }
            commit()
        }
    }

Мой код написания работает, он постоянен, но я не совсем понимаю, как ПРОЧИТАТЬ этот Arraylist из настроек.

Я много чего пытался прочитать, но он показывает мне только последний элемент, записанный в настройках

Я действительно хочу, чтобы вы поняли, что я хочу несколько значений для определенного ключа

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Это быстрый пример, основанный на ответе Набина Бхандари

fun writeArrayOnPreferences(key: String, array: ArrayList<String>, c:Context) {
    val jsonString = Gson().toJson(array)
    pref.edit().putString(key, jsonString).commit()
}

fun readArrayFromPreferences(key: String, c: Context): ArrayList<String> {
    val jsonString = pref.getString(key)
    val array = Gson().fromJson(jsonString, ArrayList<String>()::class.java)
    return array
}
0 голосов
/ 27 июня 2018

хорошо, вот как это! Если вы хотите использовать несколько данных для одного ключа в редакторе pref для общего ресурса, тогда SET является вашим решением, так как после API 11 редактор SharedPreferences принимает наборы. Вы можете преобразовать свой Список в HashSet или что-то подобное и сохранить его таким образом. Когда вы прочитаете его обратно, преобразуйте его в ArrayList, отсортируйте его, если необходимо, и все готово.

        //Set the values
        val yourSet = HashSet<String>()
        set.addAll(listOfExistingScores)
        yourPrefEditor.putStringSet("key", yourSet)
        yourPrefEditor.commit()

        //Retrieve the values
        val yourSet = yourPref.getStringSet("key", null)

НОМЕР РЕШЕНИЯ 2

будет похоже на сериализацию ArrayList и его передачу! но может быть перехват, если какое-либо значение в вашем массиве обладает каким-либо правилом, которое не может быть проанализировано, оно будет crash !

Подробнее Подробнее Тема это в Java, но это поможет вам рассказать больше!

0 голосов
/ 27 июня 2018

Попробуйте это:

    with(preferences.edit()) {
        var s = "" 
        for (value in array) {
            s = s + value + ","
        }
        putString(key, value)
        commit()
    }

Ваш массив будет сохранен как значения, разделенные запятыми, которые при чтении обратно в строку с помощью функции split станут массивом.

0 голосов
/ 27 июня 2018

Вы не можете просто зациклить значения в ArrayList, поместить их в настройки, используя один и тот же ключ для всех значений, и ожидать получить ArrayList обратно.

Вы можете преобразовать ArrayList в формат JSON и сохранить его в SharedPreferences. Затем для анализа строки JSON, чтобы получить ArrayList.

Вы можете упростить этот процесс с помощью библиотеки под названием Gson.

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