Android ArrayList спеціальних об’єктів - Зберегти у SharedPreferences - Серіалізується?


78

У мене є ArrayList об’єкта. Об'єкт містить типи "Bitmap" та "String", а потім просто отримувачі та сеттери для обох. Перш за все, чи можна серіалізувати Bitmap?

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

Якщо растрове зображення не можна серіалізувати, як мені тоді зберегти цей ArrayList?

дуже дякую.


недоліком SharedPreferences є те, що ви не можете зберігати в ньому об'єкти, тому зберігати об'єкти неможливо :(
Абхінав Сінгх Маурія

Щоб серіалізувати його, ви можете використати цю відповідь . SharedPreferencesОднак я не знаю, як це допомагає , оскільки ви не можете просто зберігати там серіалізовані об’єкти. Може, ти думаєш про Bundle?
Geobits

1
так, ви можете заощадити. Перевірте мою відповідь.
Мохаммад Імран

Відповіді:


148

Так, ви можете зберегти свій складений об’єкт у спільних налаштуваннях. Скажімо..

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

Як вставити ім'я масиву JSON при зберіганні його в преф?
Номан

Що ти маєш на увазі? будь ласка, розробіть своє запитання.?
Мохаммад Імран,

Цей код не працює, якщо ви хочете зберегти АРЛАЙЛИСТ
Bhavik Mehta

12
@Bhavik Metha, Вище написаний код не для аррейлістів, наведений вище приклад є лише прикладом. Якщо ви хочете повернути Array List типу будь-якого об’єкта, студента, тоді ми: Type type = new TypeToken <List <Student>> () {}. GetType (); Список <студента> студентів = gson.fromJson (json, тип);
Мохаммад Імран

1
Чудова ідея. Приголомшливо Дякую.
VipPunkJoshers Droopy

121

Відповідь вище працює, але не для списку:

Для збереження списку об'єктів виконайте такі дії:

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

3
Який тут пакет Type?
Shajeel Afzal

9
імпортувати java.lang.reflect.Type;
SpyZip

Що робити, якщо я використовую Type type = new TypeToken<List<?>>(){}.getType(); узагальнюючі символи приблизно так: В результаті я отримую LinkedTreeMap, і це визначення мого методу: public static List<?> getList(String json) {
f.trajkovski

23

Для мене це працювало так:

Помістіть значення в 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());

15

Для збереження:

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 - це ім’я мого користувацького об’єкта. (Містить рядкові, довгі та логічні значення)


1
Чи не слід нам використовувати applyзамість commit?
driftking9987

Де нам потрібно розмістити ці виклики методів?
Лукас Соуза,

2

Приклад Mete 'вище працював як шарм.
Ось приклад Котліна

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
}

1

Реалізація kotlin з Gsonрозширенням відповіді @ SpyZips,

Серіалізація до JSON

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

Десеріалізація для повернення до списку objs

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.