如何在房间数据库 Android 中使用 JSONObject
Posted
技术标签:
【中文标题】如何在房间数据库 Android 中使用 JSONObject【英文标题】:How to use JSONObject in Room Database Android 【发布时间】:2021-05-19 03:10:18 【问题描述】:如果我在房间数据库实体中使用 JSONObject,我会遇到问题。
@Entity(tableName = RoomDbConstant.formTable)
data class FormEntity(
@NonNull
@SerializedName("id")
@PrimaryKey(autoGenerate = false)
var formId: String,
@NonNull
@SerializedName("title")
var formTitle: String?,
@NonNull
var formCategoryId: String?,
@NonNull
var formSubCategoryId: String?,
@NonNull
var formData: String?,
@NonNull
var is_active: String? = AppConstants.ACTIVE,
@NonNull
var status: String? = AppConstants.NONE,
@NonNull
var is_sent_server: String? = AppConstants.NOT_SENT,
@NonNull
var tempEntryExisted: Boolean? = false,
@NonNull
@Embedded(prefix="FormDataEntity")
var formDataEntity: FormDataEntity?,
) : Comparable<FormEntity?>
override fun compareTo(other: FormEntity?): Int
return formTitle?.compareTo(other?.formTitle.toString(), ignoreCase = true)!!
data class FormDataEntity(
@Embedded
@NonNull
var response: FormFieldsEntity
)
data class FormFieldsEntity(
@NonNull
var is_active: String = AppConstants.ACTIVE,
@NonNull
@Embedded
var fields: ArrayList<FieldEntity>,
@NonNull
@SerializedName("title")
var formTitle: String,
@NonNull
@SerializedName("id")
var formId: String,
@NonNull
@SerializedName("gfpdf_form_settings")
var gfpdfFormSettings: JSONObject,
)
我有三个类第一个类是 FormEntity,它具有子类 FormDataEntity,而 FormDataEntity 类具有一个具有 JSONObject 的子类。所以我从 api 获取数据,其中有一个名为“gfpdf_form_settings”的 JSONObject。 enter image description here
所以我在通过使用 GSON 从 api 转换获取数据时在房间数据库中添加数据。
val data: FormDataEntity = Gson().fromJson(obj, FormDataEntity::class.java)
val formModel = FormEntity(formId.toString(),Utilities.separateTitle(data.response.formTitle)[0].toString()
,mCatId,mSubCatId.toString(),obj,data.response.is_active,
AppConstants.NONE,AppConstants.NOT_SENT,false,data)
But not able to do because I get error of roomdatabase.
Engineering Forms/Version 2 Room 数据库离线功能/EngineeringForm/app/build/tmp/kapt3/stubs/debug/com/app/engineeringform/controller/database/entities/formEntities/FormFieldsEntity.java:20:错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。 私人 org.json.JSONObject gfpdfFormSettings; ^[WARN] 请求增量注释处理,但支持被禁用,因为以下处理器不是增量的:androidx.room.RoomProcessor (DYNAMIC)。
我已经尝试了各种方法,但无法找到如何在实体类中使用 JSONObject 的解决方案。
【问题讨论】:
【参考方案1】:您不能将 JSONObject
保存为 roomdb 中的实体。在这种情况下,您可以将整个gfpdfForm
JSON 复制到JSON into Kotlin data class
插件中,为其创建唯一的数据类。
您可以参考这里: https://plugins.jetbrains.com/plugin/9960-json-to-kotlin-class-jsontokotlinclass-
将JSON转换成数据类有很多答案
-
insert JSON data using Room Library
android Room: Efficient way to transform json result into db object
【讨论】:
感谢您的评论,您的意思是我应该尝试使用 POJO 类。我已经检查过人们已经为它使用了 TypeConverters,但他们没有将它用于 JSOnObject。那么有没有什么方法可以通过转换器来使用 JSONobjects 呢? 对于类型转换,我认为您应该将整个 JSON 转换为字符串并将其作为字符串存储在数据库中。在此链接中查看。 ***.com/questions/44736604/… 所以每次你得到这个JSON,你可以直接将它转换成String并存储在db中。然后,当您想使用它时,只需将其检索为 String 并将其转换回 JSONObject。但强烈建议将其转换为 POJO,因为它有助于类型安全。以上是关于如何在房间数据库 Android 中使用 JSONObject的主要内容,如果未能解决你的问题,请参考以下文章
Android 房间数据库。如何将我的模型类添加到房间数据库中