当我尝试在使用 sqlite 数据库时启动我的应用程序时,出现此错误。
我在不同的文件中有 3 个数据类:
@Entity(tableName = "movies")
data class MovieNews(
@PrimaryKey(autoGenerate = true)
var id: Int? = null,
@SerializedName("movie_db")
@Embedded(prefix = "movies_")
val movies: List<Movies>? = null,
)
data class Movies(
val description: String? = null,
@Embedded(prefix = "actors_")
val actors: List<Actors>? = null,
)
data class Actors(
val name: String? = null
val age: Int? = null
)
当我启动应用程序时,出现错误:
error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List
如何修复此错误?
不知道这是否与问题有关,但我有这个警告
w: [kapt] Incremental annotation processing requested, but support is disabled because the following processors are not incremental: androidx.room.RoomProcessor (DYNAMIC).
我还看到了很多有关此错误的问题,但没有一个解决了我的问题
更新:
如果我注释掉嵌入行,应用程序就会编译。
我深入研究了 stackoverflow 问题,发现嵌入式
和列表可能存在问题。
@SerializedName("movie_db")
@Embedded(prefix = "movies_")
val movies: List<Movies>? = null,
最佳答案
一般情况:
data class MyDataClass(
var myfield: String
){
constructor(myfield: String): this(myfield)
}
对于您的数据类:只需在构造函数中提供默认值:
@Entity(tableName = "movies")
data class MovieNews(
@PrimaryKey(autoGenerate = true)
var id: Int? = null,
@SerializedName("movie_db")
@Embedded(prefix = "movies_")
val movies: List<Movies>? = null,
){
constructor(): this(0, "", listOf())
}
data class Movies(
val description: String? = null,
@Embedded(prefix = "actors_")
val actors: List<Actors>? = null,
) // same
data class Actors(
val name: String? = null
val age: Int? = null
) //same
为什么会发生这种情况?因为 Room 不知道如何告诉 Java 生成的代码如何初始化 null 字段(Java 不支持默认值)
如果您不喜欢该解决方案:只需删除 ?
并将所有内容设为 val
但提供默认值。
第二件事与您的问题无关,但可以通过添加来解决:
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"room.schemaLocation" : "$projectDir/schemas".toString(),
"room.incremental" : "true",
"room.expandProjection": "true"]
}
}
在你的build.gradle
关于android - 如何修复实体和 POJO 必须有可用的公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61480808/