首页 > 解决方案 > Room Android 实体和 POJO 必须有一个可用的公共构造函数

问题描述

我正在尝试将数据插入数据库,但总是得到下面提到的编译时错误,我有什么遗漏吗?

我得到的错误

错误:实体和 POJO 必须具有可用的公共构造函数。您可以有一个空的构造函数或参数与字段匹配的构造函数(按名称和类型)。- java.util.List

用户响应模型类

@Entity(tableName = "RoomDemo")
data class UserResponse(

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "code")
    @SerializedName("code")
    var code: Int,

    @Embedded
    @SerializedName("data")
    var `data`: Data,

    @Embedded
    @SerializedName("errors")
    var errors: Errors,

    @ColumnInfo(name = "message")
    @SerializedName("message")
    var message: String

) 

数据模型类

data class Data(

    @ColumnInfo(name = "avater")
    @SerializedName("avater")
    var avater: String,

    @Embedded(prefix = "avater")
    @SerializedName("user_info")
    var userInfo: UserInfo
)

用户信息模型类

data class UserInfo(
    @ColumnInfo(name = "location")
    @SerializedName("location")
    var location: String,

    @Embedded
    @SerializedName("mediafiles")
    var mediafiles: List<Mediafile>)

道接口

@Dao
interface CrushDao {

    @Insert(onConflict = REPLACE)
    fun insert(userResponse: UserResponse)

}

我的数据库

@Database(entities = [UserResponse::class], version = 2)
abstract class CrushDataBase : RoomDatabase()
{
    abstract fun crushDao():CrushDao

    companion object{
        private var INSTANCE: CrushDataBase? = null

        fun getDatabase(context: Context): CrushDataBase? {
            if (INSTANCE == null) {
                synchronized(CrushDataBase::class) {
                    INSTANCE = Room.databaseBuilder(
                        context.getApplicationContext(),
                        CrushDataBase::class.java, "crushDemo.db"
                    ).build()
                }
            }
            return INSTANCE
        }
    }
}

标签: javaandroidkotlinandroid-room

解决方案


@Embedded
@SerializedName("mediafiles")
var mediafiles: List<Mediafile>

AFAIK,您不能@Embedded用于任意事物,包括列表。

将其更改为使用关系或使用@TypeConverter并将@TypeConverters您的列类型转换List<Mediafile>为一些有效的列类型,例如String.


推荐阅读