Intereting Posts
Как проверить силу (интенсивность) звука во время записи? Перечислите все файлы и папку Dropbox с помощью API Dropbox и загрузите файл, нажатый в android Каков наилучший способ хранения этой маленькой таблицы данных только для чтения в телефоне Android? Библиотеки обработки видео и фильтрации Rid.container не разрешен Как обрабатывать AsyncTask onPostExecute при приостановке, чтобы избежать исключения IllegalStateException Установите apk из другой программы Как переопределить анимацию активности ввода, если она указана с помощью запуска Как разработать / перенести родную библиотеку C в android? Ошибки аудио и видеозаписи в android Метод getView () ArrayAdapter повторяет первые два или три элемента в списке Тип входа ввода-вывода android InputMethodManager Продолжить Задание после завершения всех задач Как получить кнопку «Далее» на экранной клавиатуре Android вместо кнопки «Go» в телефонной запинке Создание проекта андроидной библиотеки с использованием jar-зависимостей

Хранить и извлекать объект класса по общим предпочтениям

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

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

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

Невозможно.

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

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

Да, мы можем сделать это с помощью Gson

Загрузить рабочий код от 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 следующие в build.gradle зависимости build.gradle

 compile 'com.google.code.gson:gson:2.6.2' 

Мы можем использовать 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(); } 

Когда нам нужно извлечь Object from Preference. Используйте код, как показано ниже.

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

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

У меня есть класс MyClass и ArrayList <MyClass>, который я хочу сохранить для общих настроек. Сначала я добавил метод 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 <MyClass>»:

 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.

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

Хранить:

 Gson gson = new Gson; JSONObject jsonObject = response.getJSONObject(); String json = gson.toJson(jsonObject); getPrefs().setUserJson(json); 

Получить:

 String json = getPrefs().getUserJson(); 

Вам нужно восстановить объект даже после закрытия приложения или только во время его запуска?

Вы можете сохранить его в базе данных.
Или просто создайте собственный класс приложений.

 public class MyApplication extends Application { private static Object mMyObject; // static getter & setter ... } <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application ... android:name=".MyApplication"> <activity ... /> ... </application> ... </manifest> 

И затем от каждой деятельности:

 ((MyApplication) getApplication).getMyObject(); 

Не самый лучший способ, но он работает.

Использование этого объекта -> TinyDB – Android-Shared-Preferences-Turbo – очень просто. Вы можете сохранить большинство обычно используемых объектов с ним, например массивы, целые числа, списки строк и т. Д.

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

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

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

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

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