Ответ 1
Невозможно.
Вы можете хранить только простые значения в SharedPrefences SharePreferences.Editor
Что особенно важно для класса, который вам нужно сохранить?
В 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);
Последняя версия GSON может быть загружена с github.com/google/gson.
Если вы используете Gradle/Android Studio, просто build.gradle
следующее в build.gradle
зависимостей build.gradle
-
implementation '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:
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();
Вы можете использовать GSON, используя Gradle Build.gradle:
implementation 'com.google.code.gson:gson:2.8.0'
Затем в вашем коде, например, пары string/boolean с 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())
}
Вы можете сделать это с PowerPreference
библиотеки PowerPreference
за 3 простых шага!
https://github.com/AliAsadi/PowerPreference
Object obj = new Object();
PowerPreference.getDefaultFile().put("object",obj);
Object obj = PowerPreference.getDefaultFile()
.getObject("object", Object.class);
Используя этот объект → TinyDB--Android-Shared-Preferences-Turbo, он очень прост. вы можете сохранить большинство обычно используемых объектов с ним, как массивы, целые числа, списки строк и т.д.
Вы можете использовать библиотеку комплексных настроек Android - от Felipe Silvestre для хранения ваших пользовательских объектов. В основном, он использует механизм 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);
Вам нужно восстановить объект даже после закрытия приложения или только во время его запуска?
Вы можете сохранить его в базе данных.
Или просто создайте собственный класс приложения.
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();
Не самый лучший способ, но он работает.
Нельзя хранить объекты в SharedPreferences, что я сделал, это создать открытый класс, поместить все параметры, которые мне нужны, и создать сеттеры и геттеры, я смог получить доступ к своим объектам,
Да. Вы можете хранить и извлекать объект с помощью Sharedpreference