java - 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
}
}
}
解决方案
@Embedded
@SerializedName("mediafiles")
var mediafiles: List<Mediafile>
AFAIK,您不能@Embedded
用于任意事物,包括列表。
将其更改为使用关系或使用@TypeConverter
并将@TypeConverters
您的列类型转换List<Mediafile>
为一些有效的列类型,例如String
.
推荐阅读
- jenkins - Jenkins(向破坏构建的个人发送单独的电子邮件)
- netsuite - Netsuite / Freemarker - 按行拆分项目描述不起作用
- android-studio - Android studio 3.4 不显示旧版本的预览设备
- javascript - 选择/取消选择元素时替换画布img
- mysql - 如何将子查询替换为连接查询
- c# - 你可以在构造函数中实例化另一个类吗?
- python - 将相同字典列表转换为 Dataframe
- php - 从 foreach 结果 PHP 中删除字符
- c++ - vector 如何在特定位置调用复制构造函数?
- javascript - 与 mysql 连接的 hapi.js 未在浏览器上显示该值