android - 如何修复实体和 POJO 必须有可用的公共(public)构造函数

标签 android sqlite kotlin

当我尝试在使用 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/

相关文章:

java - JSON错误加载

java - 如何使用 socks 配置 Android SDK 管理器?

Android SQLite 插入-选择

android - 如何将线性布局 xml 文件合并到撰写文件中?

android - 错误 : com. app.android.dagger.component.AppComponent (unscoped) may not reference scoped bindings:

java - 从 recyclview 添加 jsonarray

java - 在 Android 7 org.apache.http (Apache HttpClient 4.0) 中启用已弃用的密码套件后主机名不匹配

android - 尝试重命名 SQLite 数据库中的元素会使应用程序崩溃

flash - 面向所有用户的带有 Actionscript (AIR) 的 SQLite

android - Butterknife 7.x 是否适用于 Kotlin M14?