【发布时间】:2021-06-04 21:08:24
【问题描述】:
我正在尝试了解如何将 Room 与关系表一起使用。我创建了一个 Job 模型,它有一个位置列表,因此需要 Job 和 Location 对象之间的一对多关系。为此,我创建了一个 JobWrapper 数据类来保存 Job 和位置。但是,在构建时出现以下错误:
类必须是@Entity 或@DatabaseView。 - java.util.Collectionerror:实体和 POJO 必须有一个可用的 公共构造函数。你可以有一个空的构造函数或构造函数 其参数与字段匹配(按名称和类型)。 - java.util.Collection \models\JobWrapper.java:12:错误:找不到 java.util.Collection 中的子实体列
parentId。 选项: 私有 java.util.Collection位置; 公共最终类 JobWrapper { ^ 尝试了以下构造函数,但它们未能匹配:
JobWrapper(models.Job,java.util.Collection) -> [参数:作业-> 匹配字段:作业,参数:位置-> 匹配字段:不匹配] 模型\JobWrapper.java:9: 错误:找不到字段的设置器。
我注意到它至少找不到位置表。但是,我不知道如何处理这个问题。从数据库读取时没有出现该问题 - 当我尝试使用 JobDAO 将数据放入数据库时,它首次出现。我已经花了一天时间尝试解决它,因此正在寻找解决方案或有关如何解决它的一些建议。
注意:我一直遵循以下指南:
- https://developer.android.com/training/data-storage/room/relationships#one-to-many
- https://dev.to/normanaspx/android-room-how-works-one-to-many-relationship-example-5ad0
下面是我项目中的一些相关代码sn-ps:
JobWrapper.kt
data class JobWrapper(
@Embedded val job: Job,
@Relation(
parentColumn = "jobid",
entityColumn = "parentId"
) var locations : Collection<Location>
)
工作
@Entity
data class Job (
@PrimaryKey
@NonNull
var jobid : String,
@NonNull
@ColumnInfo(name = "job_status")
var status : JobStatus,
@NonNull
@SerializedName("createdByAuth0Id")
var creator : String,
@SerializedName("note")
var note : String?,
@NonNull
var organisationId : String,
@NonNull
var type : JobType,
@SerializedName("atCustomerId")
@NonNull
@ColumnInfo(name = "working_at_customer_id")
var workingAtCustomerId : String,
@SerializedName("toCustomerId")
@NonNull
@ColumnInfo(name = "working_to_customer_id")
var workingToCustomerId : String,
)
JobStatus.kt
enum class JobStatus {
CREATED,
READY,
IN_PROGRESS,
FINISHED
}
Location.kt
@Entity
data class Location (
@PrimaryKey(autoGenerate = true)
var entityId: Long,
@NonNull
var parentId: String,
@NonNull
var locationId: String,
@NonNull
var type: String
) {
constructor() : this(0, "", "", "")
}
JobDao.kt
@Dao
interface JobDAO {
@Transaction
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(job: JobWrapper)
@Transaction
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(jobs: List<JobWrapper>)
@Transaction
@Update
fun update(job: JobWrapper)
@Transaction
@Delete
fun delete(job: JobWrapper)
@Transaction
@Query("DELETE FROM Job")
fun deleteAll()
@Transaction
@Query("SELECT * FROM Job")
fun getAll(): LiveData<List<JobWrapper>>
}
【问题讨论】:
标签: android kotlin android-room