如何使用Kotlin在共享首选项中存储数据类对象?

如何使用KotlinSharedPreferences存储数据类实例。 我写这个代码,但它不工作,每次检索数据时,它会产生崩溃。 我必须在本地保存用户预订,并且每次都从首选项中获取 ,并将这些值放在单例中

崩溃是:

 java.lang.IllegalStateException: gson.fromJson(json, BookingResponse::class.java) must not be null. 

BookingResponse是我的数据类

 fun saveResponse(context: Context,bookingResponse: BookingResponse) { val prefs = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) val prefsEditor = prefs.edit() val gson = Gson() val json = gson.toJson(bookingResponse) prefsEditor.putString(Constants.BOOKING, json) prefsEditor.commit() } /** * Get bookingResponse from the shared preference * * @return Saved BookingResponse */ fun getResponse(context:Context): BookingResponse { val prefs = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) val gson = Gson() val json = prefs.getString(Constants.BOOKING, "") return gson.fromJson(json, BookingResponse::class.java) } 

您的BookingResponse数据类包含定义为非null的属性。

在第一次调用prefs.getString(Constants.BOOKING, "")那一刻, json被设置为一个空字符串。 当您将此字符串转换为BookingResponse实例时,您不会在此处设置任何属性。 Gson将创建这个实例,无论如何,导致null值属性。 由于这是不允许的,你会得到这个例外。

要解决这个问题,你需要提供一个默认的字符串,其中包含所有的属性,或者使用你的数据类来实现默认值。 或者,您可以分别处理getString()的默认值。

 json.takeUnless { it.isEmpty() } ?.let { gson.fromJson(json, BookingResponse::class.java) } ?: createEmptyBookingResponse()