我遇到了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数据保存方法的代码而导致的。如果是这样,则肯定该应用程序将无法通过单独关闭和打开该应用程序来保存数据。
也许有帮助解决此问题的方法,我在我的应用程序中将对象存储为单独的.kt文件。
答案 0 :(得分:0)
当您要将自定义对象存储在SharedPreferences中时,应考虑将Gson与TypeTokens一起使用。
例如,我将使用自定义类Example
data class Example(
val test: String
)
首先,您应该创建一次对象。
lateinit var preferences : SharedPreferences
val gson = Gson()
val exampleType = object : TypeToken<Example>() {}.type
然后初始化这样的首选项(如果您使用的是默认的SharedPreferences):
preferences = PreferenceManager.getDefaultSharedPreferences(this)
最后,您可以使用这两个功能保存/加载数据
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()
}