Kotlin,将复杂的信息保存到内部存储器



我目前正在开发我的第一个应用程序,它是一个问答应用程序,我正在尝试实现一个统计选项,以显示%的正确/不正确问题。

为了做到这一点,每个问题都有一个"域";isAnswered";以及";isCorrect";所以我可以很容易地跟踪统计数据;保存";按钮保存问题(如果您选择(。

我在应用程序关闭后保存信息时遇到了问题,我的问题是这样写的:

data class Question(
val id : Int,
val question : String,
val correctAnswer: Int,
val hint : String,
val difficulty: String,
var isAnswered: Boolean,
var isCorrect : Boolean,
var isSaved : Boolean
)

问题被实例化并保存如下:


object Constants{
const val DIFFICULTY: String = "difficutly"

var easyQuestionsAnswered  = 0
var easyQuestionsAnsweredCorrectly = 0
var hardQuestionsAnswered  = 0
var hardQuestionsAnsweredCorrectly = 0
var intermediateQuestionsAnswered  = 0
var intermediateQuestionsAnsweredCorrectly = 0

val empty = ArrayList<Question>()
val easyQuestionsList = ArrayList<Question>()
val intermediateQuestionsList = ArrayList<Question>()
val hardQuestionsList = ArrayList<Question>()
val allQuestionsList = ArrayList<Question>()
val savedQuestions = ArrayList<Question>()
val que1 = Question(
1,
"בהינתן n/100 עצי AVL שבכל עץ יש 100 איברים, ניתן לבנות עץ AVL שמכיל את n האיברים ב (O(n",
0,
"study more",
"intermediate",
false,
false,
false
)
intermediateQuestionsList.add(que1)

当用户回答问题时,问题字段会相应更新,但这些更改在应用程序关闭时不会保存。

我曾想过为这些字段创建一个布尔数组,并使用问题的id作为键,然后在使用sharedPrefrences加载时更新数据,我甚至不能100%确定如何使用,但可能可以管理它。但这似乎是一种相当丑陋的方式,我真的希望有一个更简单的方法。

我在保存名为";savedQuestions";,我试着使用Gson,但当我打开它时,它就崩溃了,因为这行代码

val questions : ArrayList<Question> = Gson().fromJson<ArrayList<Question>>(json, type)

我试着遵循了几个指南,但似乎没有一个对我有效,所有这些都导致了开机崩溃

SharedPreference是一种更简单的方法,但有明显的缺点。它只适用于较小的键/值对,而且,如果用户卸载应用程序或删除缓存的数据,一切都将消失。

使用Firebase将这样的键值/对存储在服务器上,然后实际检索用户是否回答。在这种情况下,当后端不涉及任何逻辑时,保存/检索更容易。如果您只想在本地存储数据,请使用room数据库,它比创建MySqlite和SQLiteOpenHelper类的传统方法更容易编写,但同时也很容易提供对脱机存储的支持。

如果您只想保存一个问题是否得到了回答,请确保您从服务器收到的问题始终具有问题标识符,您可以使用该标识符来检查哪个问题是否得到回答,是的,这不是一种理想的方式,因为您不能始终确定您将从服务器收到包含问题的JSON响应,有时服务器可能也会停机。

val questions : ArrayList<Question> = Gson().fromJson<ArrayList<Question>>(json, type) 

只有当问题类不包含任何适当的数据类型时才会出错。因此,如果不查看确切的错误堆栈跟踪和json响应,就很难预测到底什么是混乱的。

最新更新