【问题标题】:Room Android Entities and POJOs must have a usable public constructorRoom Android 实体和 POJO 必须有一个可用的公共构造函数
【发布时间】:2020-09-03 12:29:29
【问题描述】:

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

我遇到了错误

错误:实体和 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
        }
    }
}

【问题讨论】:

  • 这是什么?! : @SerializedName("data") var data: 数据为什么要在单引号中包围数据?

标签: java android kotlin android-room


【解决方案1】:
@Embedded
@SerializedName("mediafiles")
var mediafiles: List<Mediafile>

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

要么将其更改为使用关系,要么使用@TypeConverter@TypeConverters 将您的List&lt;Mediafile&gt; 转换为一些有效的列类型,例如String

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2018-06-24
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2021-05-01
    • 2020-08-12
    相关资源
    最近更新 更多