Android ArrayList настраиваемых объектов - Сохранить в SharedPreferences - Сериализуемый?

У меня есть ArrayList объекта. Объект содержит типы Bitmap и String, а затем только методы получения и установки для обоих. Прежде всего, можно ли сериализовать растровое изображение?

Как мне сериализовать это, чтобы сохранить в SharedPreferences? Я видел, как многие люди задают аналогичный вопрос, но ни один из них не дает хорошего ответа. Я бы предпочел несколько примеров кода, если это вообще возможно.

Если растровое изображение не сериализуемо, как мне сохранить этот ArrayList?


person Paul Blundell    schedule 20.02.2013    source источник
comment
недостатком SharedPreferences является то, что вы не можете хранить в нем объекты, поэтому невозможно хранить объект :(   -  person Abhinav Singh Maurya    schedule 20.02.2013
comment
Чтобы сериализовать его, вы можете использовать этот ответ. Я не знаю, как это помогает с SharedPreferences, поскольку вы не можете просто хранить там сериализованные объекты. Может ты думаешь о Bundle?   -  person Geobits    schedule 20.02.2013
comment
да можно сэкономить. Проверьте мой ответ.   -  person Mohammad Imran    schedule 22.02.2013


Ответы (7)


Да, вы можете сохранить свой составной объект в общих настройках. Скажем так ..

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 

..и теперь вы можете получить свой объект как:

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);

Для получения дополнительной информации щелкните здесь.

Если вы хотите вернуть ArrayList объекта любого типа, например Student, затем используйте:

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);
person Mohammad Imran    schedule 21.02.2013
comment
Как поместить имя массива JSON при сохранении его в префы? - person Noman; 04.03.2013
comment
Что ты имел в виду? просьба уточнить свой вопрос.? - person Mohammad Imran; 16.12.2013
comment
Этот код не работает, если вы хотите сохранить ARRAYLIST. - person Bhavik Mehta; 28.01.2015
comment
@Bhavik Metha, Выше написанный код не для Arraylists, приведенный выше код является просто примером. Если вы хотите вернуть Array List типа any any object e.d student, то нам: Type type = new TypeToken ‹List ‹Student›› () {}. GetType (); Список ‹Student› студенты = gson.fromJson (json, type); - person Mohammad Imran; 28.01.2015
comment
Отличная идея. Потрясающие. Спасибо. - person jojemapa; 24.10.2016
comment
Как мне обновить этот список? Есть ли способ обновить этот список? - person Aslam Hossin; 20.11.2017

Ответ выше работает, но не для списка:

Для сохранения списка объектов сделайте так:

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);

Прочтите объект json:

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);
person SpyZip    schedule 25.02.2014
comment
Какой пакет Type здесь? - person Shajeel Afzal; 19.08.2014
comment
import java.lang.reflect.Type; - person SpyZip; 19.08.2014
comment
Что, если я использую подстановочные знаки, например: Type type = new TypeToken<List<?>>(){}.getType(); В результате я получаю LinkedTreeMap, и это определение моего метода: public static List<?> getList(String json) { - person f.trajkovski; 22.05.2018

Для меня это работало так:

Поместите значения в SharedPreferances:

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();

Чтобы получить значения из SharedPreferances:

Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());
person Apurva Kolapkar    schedule 25.10.2016

Для сохранения:

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

Для нагрузки:

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

PhoneCallLog - это имя моего настраиваемого объекта. (Содержит строковые, длинные и логические значения)

person Mete    schedule 13.01.2016
comment
Разве мы не должны использовать apply вместо commit? - person driftking9987; 13.01.2016
comment
Где нам нужно разместить эти вызовы методов? - person Lucas Sousa; 25.03.2020

Вышеупомянутый пример Mete сработал как шарм.
Вот пример Kotlin

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()

спасти

fun saveObjectToArrayList(yourObject: YourObject) {
    val bookmarks = fetchArrayList()
    bookmarks.add(0, yourObject)
    val prefsEditor = prefs.edit()

    val json = gson.toJson(bookmarks)
    prefsEditor.putString("your_key", json)
    prefsEditor.apply()
}

читать

fun fetchArrayList(): ArrayList<YourObject> {
    val yourArrayList: ArrayList<YourObject>
    val json = prefs.getString("your_key", "")

    yourArrayList = when {
        json.isNullOrEmpty() -> ArrayList()
        else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
    }

    return yourArrayList
}
person r3dm4n    schedule 13.07.2019

решение

Не волнуйтесь, вы можете следовать моему коду. Я использую собственный класс sharedPreference для хранения любого типа List в sharedPreference.

public class AuthPreference {
    private static final String MY_PREFERENCES = "MY_PREFERENCES";
    private static final int MODE = Context.MODE_PRIVATE;
    private static AuthPreference pref;
    private final SharedPreferences sharedPreference;
    private final SharedPreferences.Editor editor;

    @SuppressLint("CommitPrefEdits")
    public AuthPreference(Context context) {
        sharedPreference = context.getSharedPreferences(MY_PREFERENCES, MODE);
        editor = sharedPreference.edit();
    }

    public void clear() {
        editor.clear().commit();

    }

    //Here  save your api responce like YourModel arraylist

    public void saveDataResponce(ArrayList<YourModel> model_, String key) {
        SharedPreferences.Editor editor = sharedPreference.edit();
        Gson gson = new Gson();
        String json = gson.toJson(model_);
        editor.putString(key, json);
        editor.apply();
    }

//Here we get our api responce like YourModel arraylist.Using key value when you want to define.

    public ArrayList<YourModel> getDataResponce(String key) {
        Gson gson = new Gson();
        String json = sharedPreference.getString(key, null);
        Type type_ = new TypeToken<ArrayList<YourModel>>() {
        }.getType();
        return gson.fromJson(json, type_);
    }
}
person Er.Prem Singh daksha    schedule 07.04.2021

Реализация kotlin с Gson, расширяющая ответ @ SpyZips,

Сериализация в JSON

val jsonCars: String = Gson().toJson(cars);

Десериализация до возврата к списку объектов

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
person All Іѕ Vаиітy    schedule 29.06.2020