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
相关产品推荐
相关产品推荐

