Возможный глюк с GSON? Или плохое кодирование? - PullRequest
0 голосов
/ 01 сентября 2018

Я наткнулся на GSON и почти влюбился в него. Это казалось очень простым способом мгновенного сохранения объектов и всех переменных, содержащихся в них, через общие настройки или внутреннее хранилище.

Проблема в том, что, когда мои данные успешно сохраняются при закрытии и открытии приложения, когда я перезагружаю телефон, общее предпочтение / внутреннее хранилище больше не загружает данные. Они все еще там, но данные, которые они хранят, равны нулю.

Например, я смог сохранить это без проблем

fun save() {
getPreferences(0).edit().putString("name", Object.name.toString()).apply()
}

fun load(){

Object.name = JSONArray(getPreferences(0).getString("name", Object.name)
}

Но любая попытка сделать то же самое с помощью преобразования GSON не давала того же результата после перезагрузки телефона. Данные сохраняются без проблем, когда я просто открываю и закрываю приложение.

fun save(){
getPreferences(0).edit().putString("Object", Gson().toJson(Object)).commit()
}

fun load(){
var copiedObject = Gson().fromJson(getPreferences(0).getString("Object", Gson().toJson(Object)), Object.javaClass)

Object.name = copiedObject.name
}

Я не уверен, что это из-за того, что я неправильно написал код для метода сохранения данных GSON. Если это так, то приложение не сможет сохранить данные, закрыв и открыв приложение в одиночку.

Возможно, если это поможет решить эту проблему, у меня Object хранится в отдельном файле .kt в моем приложении.

1 Ответ

0 голосов
/ 01 сентября 2018

Если вы хотите сохранить пользовательские объекты в SharedPreferences, вам следует рассмотреть возможность использования Gson с TypeTokens.

Например, я буду использовать пользовательский класс. Пример

data class Example(
    val test: String
)

Прежде всего вы должны создать свои объекты один раз.

lateinit var preferences : SharedPreferences
val gson = Gson()
val exampleType = object : TypeToken<Example>() {}.type

Затем инициализируйте настройки следующим образом (если вы используете SharedPreferences по умолчанию):

preferences = PreferenceManager.getDefaultSharedPreferences(this)

Наконец, вы можете сохранить / загрузить данные, используя эти 2 функции

fun load() : Example? {
    return gson.fromJson(preferences.getString("example", null), exampleType) as Example?
}

fun save(example: Example) {
    preferences.edit().putString("example", gson.toJson(example)).apply()

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