You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objectbox无法保存对象列表:关联数据显示异常求助

Objectbox Admin无法显示Data实体中DataField列表数据的解决办法

你遇到的问题根源是Objectbox不支持直接用普通List<Entity>来定义持久化的一对多关系,必须使用Objectbox提供的ToOne/ToMany容器类配合关系注解,否则Objectbox会忽略这个List字段,导致Admin Browser中无法看到对应数据,仅能看到UID。

解决步骤及代码修改

1. 修改Data实体类

将普通的List<DataField>替换为ToMany<DataField>,并通过@Backlink关联DataField中的外键字段:

@Entity
data class Data(
    @Id
    var id: Long = 0,
    var name: String = "",
    var lastEdited: String = "",
    // 通过@Backlink关联DataField中的ownerData字段,定义一对多关系
    @Backlink(to = "ownerData")
    val dataFields: ToMany<DataField> = ToMany(this, Data_.dataFields)
)

2. 修改DataField实体类

添加ToOne<Data>类型的外键字段,指向所属的Data对象,同时给@Id字段补充默认值(Objectbox要求@Id字段必须有默认值0):

@Entity
data class DataField(
    @Id
    var id: Long = 0, // 补充Id字段默认值,符合Objectbox规范
    @Unique(onConflict = ConflictStrategy.REPLACE)
    var fieldName: String = "",
    var dataFieldType: Int = DataFieldType.SHORTSTRING.ordinal,
    var dataValue: String = "",
    var first: String = "",
    var second: String = "",
    var third: String = "",
    var isEnabled: Boolean = true,
    var fieldHint: String? = "Enter value for $fieldName",
    // 添加ToOne外键,关联到所属的Data对象
    var ownerData: ToOne<Data> = ToOne(this, DataField_.ownerData)
)

3. 重新生成Objectbox模型并清理数据

  • 执行Android Studio的Build -> Make Project,触发Objectbox模型生成
  • 再次清除虚拟设备的应用数据/缓存,重新运行应用

正确的关联保存方式

保存Data和DataField时,需要建立两者的关联关系,两种方式任选其一:

方式一:通过DataField的外键关联

val data = Data(name = "用户信息", lastEdited = "2024-05-20")
val usernameField = DataField(fieldName = "用户名", dataValue = "J_Orotayo")
val emailField = DataField(fieldName = "邮箱", dataValue = "test@example.com")

// 关联DataField到Data
usernameField.ownerData.target = data
emailField.ownerData.target = data

// 保存到数据库
boxStore.boxFor(Data::class.java).put(data)
boxStore.boxFor(DataField::class.java).put(usernameField, emailField)

方式二:通过Data的ToMany集合添加

val data = Data(name = "用户信息", lastEdited = "2024-05-20")
val usernameField = DataField(fieldName = "用户名", dataValue = "J_Orotayo")
val emailField = DataField(fieldName = "邮箱", dataValue = "test@example.com")

// 添加到Data的dataFields集合
data.dataFields.addAll(listOf(usernameField, emailField))

// 保存Data,Objectbox会自动保存关联的DataField
boxStore.boxFor(Data::class.java).put(data)

完成以上修改后,Objectbox会在数据库中建立正确的外键关系,Admin Browser就能正常显示Data对象关联的DataField列表数据了。

内容的提问来源于stack exchange,提问作者J_Orotayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:27:28