хранить и извлекать объект класса в общих настройках - PullRequest
106 голосов
/ 24 марта 2011

В Android мы можем сохранить объект класса в общих настройках и получить его позже?

Если это возможно, как это сделать?Если это невозможно, каковы другие возможности сделать это?

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

Ответы [ 12 ]

314 голосов
/ 23 марта 2013

Да, мы можем сделать это, используя Гсон

Скачать рабочий код с GitHub

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

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

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

Для получения

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

Update1

Самую последнюю версию GSON можно загрузить с github.com / google / gson .

Update2

Если вы используете Gradle / Android Studio, просто укажите следующее в build.gradle разделе зависимостей -

implementation 'com.google.code.gson:gson:2.6.2'
44 голосов
/ 02 мая 2012

мы можем использовать Outputstream для вывода нашего объекта во внутреннюю память. И преобразовать в строку, а затем сохранить в настройках. Например:

    mPrefs = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor ed = mPrefs.edit();
    ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

    ObjectOutputStream objectOutput;
    try {
        objectOutput = new ObjectOutputStream(arrayOutputStream);
        objectOutput.writeObject(object);
        byte[] data = arrayOutputStream.toByteArray();
        objectOutput.close();
        arrayOutputStream.close();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
        b64.write(data);
        b64.close();
        out.close();

        ed.putString(key, new String(out.toByteArray()));

        ed.commit();
    } catch (IOException e) {
        e.printStackTrace();
    }

когда нам нужно извлечь объект из предпочтения. Используйте код как показано ниже

    byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
    if (bytes.length == 0) {
        return null;
    }
    ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
    Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
    ObjectInputStream in;
    in = new ObjectInputStream(base64InputStream);
    MyObject myObject = (MyObject) in.readObject();
15 голосов
/ 24 марта 2011

Не возможно.

Вы можете хранить только простые значения в SharedPrefences SharePreferences.Editor

Что конкретно о классе вам нужно сохранить?

8 голосов
/ 22 августа 2013

У меня была такая же проблема, вот мое решение:

У меня есть класс MyClass и ArrayList , которые я хочу сохранить в общих настройках. Сначала я добавил метод в MyClass, который преобразует его в объект JSON:

public JSONObject getJSONObject() {
    JSONObject obj = new JSONObject();
    try {
        obj.put("id", this.id);
        obj.put("name", this.name);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return obj;
}

Тогда вот метод для сохранения объекта «ArrayList items»:

SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
    SharedPreferences.Editor editor = mPrefs.edit();

    Set<String> set= new HashSet<String>();
    for (int i = 0; i < items.size(); i++) {
        set.add(items.get(i).getJSONObject().toString());
    }

    editor.putStringSet("some_name", set);
    editor.commit();

А вот метод получения объекта:

public static ArrayList<MyClass> loadFromStorage() {
    SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);

    ArrayList<MyClass> items = new ArrayList<MyClass>();

    Set<String> set = mPrefs.getStringSet("some_name", null);
    if (set != null) {
        for (String s : set) {
            try {
                JSONObject jsonObject = new JSONObject(s);
                Long id = jsonObject.getLong("id"));
                String name = jsonObject.getString("name");
                MyClass myclass = new MyClass(id, name);

                items.add(myclass);

            } catch (JSONException e) {
                e.printStackTrace();
         }
    }
    return items;
}

Обратите внимание, что StringSet в общих настройках доступен начиная с API 11.

7 голосов
/ 06 января 2016

Использование библиотеки Gson:

dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}

Хранить:

Gson gson = new Gson();
//Your json response object value store in json object
JSONObject jsonObject = response.getJSONObject();
//Convert json object to string
String json = gson.toJson(jsonObject);
//Store in the sharedpreference
getPrefs().setUserJson(json);

Получить:

String json = getPrefs().getUserJson();
1 голос
/ 07 декабря 2018

Вы можете сделать это, используя PowerPreference библиотеку за 3 простых шага!

https://github.com/AliAsadi/PowerPreference

1. Создать объект

Object obj = new Object();

2. Написать в общий доступ

PowerPreference.getDefaultFile().put("object",obj);

3. Получение объекта

Object obj = PowerPreference.getDefaultFile()
                            .getObject("object", Object.class);
1 голос
/ 20 января 2018

Вы можете использовать GSON, используя Gradle Build.gradle:

implementation 'com.google.code.gson:gson:2.8.0'

Тогда в вашем коде, например, пары строка / логическое значение с Kotlin:

        val nestedData = HashMap<String,Boolean>()
        for (i in 0..29) {
            nestedData.put(i.toString(), true)
        }
        val gson = Gson()
        val jsonFromMap = gson.toJson(nestedData)

Добавление в SharedPrefs:

        val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()
        sharedPrefEditor.putString("sig_types", jsonFromMap)
        sharedPrefEditor.apply()

Теперь для получения данных:

val gson = Gson()
val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)
val json = sharedPref.getString("sig_types", "false")
val type = object : TypeToken<Map<String, Boolean>>() {}.type
val map = gson.fromJson(json, type) as LinkedTreeMap<String,Boolean>
for (key in map.keys) {
     Log.i("myvalues", key.toString() + map.get(key).toString())
}
0 голосов
/ 14 августа 2016

Вы можете использовать Сложные настройки Android - от Фелипе Сильвестра Библиотека для хранения пользовательских объектов. По сути, он использует механизм GSON для хранения объектов.

Чтобы сохранить объект в настройках:

User user = new User();
user.setName("Felipe");
user.setAge(22); 
user.setActive(true); 

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(
     this, "mypref", MODE_PRIVATE);
complexPreferences.putObject("user", user);
complexPreferences.commit();

И чтобы вернуть его обратно:

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE);
User user = complexPreferences.getObject("user", User.class);
0 голосов
/ 03 мая 2016

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

0 голосов
/ 28 января 2016

Да. Вы можете сохранить и получить объект, используя Sharedpreference

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