如何在房间数据库 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paging 3 Android 从房间获取最新数据

Android - 如何从小部件访问房间数据库

Android 房间数据库。如何将我的模型类添加到房间数据库中

Android 房间数据库 - 不确定如何将 Cursor 转换为此方法的返回类型

在android房间数据库中连接两个字符串列

从带有视图的房间 android 中获取数据