Android TypeConverter函数从未使用过房间数据库

Android TypeConverter函数从未使用过房间数据库,android,android-studio,android-room,Android,Android Studio,Android Room,我有一个自定义对象的列表,我想把它保存在数据库中 所以我必须使用类型转换器来实现这一点 我的问题是,当我实现功能时,我发现了一个错误 使用TypeConverter注释的函数从未使用过 以下是错误: A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution error: The columns returned by the query does not have the field

我有一个自定义对象的列表,我想把它保存在数据库中

所以我必须使用类型转换器来实现这一点

我的问题是,当我实现功能时,我发现了一个错误

使用TypeConverter注释的函数从未使用过

以下是错误:

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
error: The columns returned by the query does not have the fields [avatar,email,first_name,id,last_name] in com.hraa.fakeusers.model.UserData even though they are annotated as non-null or primitive. Columns returned by the query: [data]
    public abstract androidx.lifecycle.LiveData<java.util.List<com.hraa.fakeusers.model.UserData>> getUsers();
执行org.jetbrains.kotlin.gradle.internal.KaptExecution时发生故障
错误:查询返回的列没有com.hraa.fakeusers.model.UserData中的字段[avatar、email、first_name、id、last_name],即使这些字段被注释为非null或基元。查询返回的列:[data]
公共抽象androidx.lifecycle.LiveData getUsers();
下面是代码:

@Entity(tableName = USER_DATA_TABLE)
data class DataModel(
    val data: List<UserData>,
    val page: Int,
    val per_page: Int,
    val total: Int,
    val total_pages: Int
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null
}

data class UserData(
    val avatar: String,
    val email: String,
    val first_name: String,
    val id: Int,
    val last_name: String
)

class Converters {

    @TypeConverter
    fun toUsersData(value: String): List<UserData> {
        val type = object : TypeToken<List<UserData>>() {}.type
        return Gson().fromJson(value, type)
    }

    @TypeConverter
    fun fromUsersData(usersData: List<UserData>): String {
        return Gson().toJson(usersData)
    }
}

@Database(entities = [DataModel::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase: RoomDatabase() {

    abstract fun dataDao(): DataDao
}

    @Dao
interface DataDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertData(data: DataModel)

    @Delete
    suspend fun deleteData(data: DataModel)

    @Query("SELECT data FROM USER_DATA_TABLE")
    fun getUsers(): LiveData<List<UserData>>
}
@实体(tableName=USER\u DATA\u TABLE)
数据类数据模型(
val数据:列表,
val page:Int,
val per_页面:Int,
val总计:整数,
val总页数:Int
) {
@PrimaryKey(自动生成=真)
变量id:Int?=null
}
数据类用户数据(
瓦尔·阿凡达:字符串,
val电子邮件:String,
val first_name:String,
val id:Int,
val last_name:String
)
类转换器{
@类型转换器
数据(值:字符串):列表{
val type=object:TypeToken(){}.type
返回Gson().fromJson(值,类型)
}
@类型转换器
来自usersData(usersData:List)的乐趣:字符串{
返回Gson().toJson(usersData)
}
}
@数据库(实体=[DataModel::class],版本=1,exportSchema=false)
@类型转换器(转换器::类)
抽象类AppDatabase:RoomDatabase(){
抽象有趣的dataDao():dataDao
}
@刀
接口数据道{
@插入(onConflict=OnConflictStrategy.REPLACE)
suspend fun insertData(数据:DataModel)
@删除
暂停删除数据(数据:数据模型)
@查询(“从用户数据表中选择数据”)
fun getUsers():LiveData
}
注意:ToUserData()函数从未使用过。。我不知道为什么

注意:ToUserData()函数从未使用过

你怎么能确定?我猜这个函数可以很好地工作,但这里有两种类型的转换:

@Query("SELECT data FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<UserData>>
如果构建成功,则此函数没有问题。您还可以在Java类中找到这个函数,它是Room在构建过程中自动生成的

您可以尝试添加另一个数据类:

data class UserDataList(
    val data: List<UserData>
)
数据类UserDataList(
val数据:列表
)
并将数据方法更改为:

@Query("SELECT data FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<UserDataList>>
@Query(“从用户数据表中选择数据”)
fun getUsers():LiveData

关于ToUserData()。。我在自动生成的类中检查了它,但它不在那里,但当我尝试您提供的查询时,它实际上在那里。我也像您一样创建了数据类,它工作正常!非常感谢你。但是你能解释一下为什么以前的方法不起作用吗?我应该将每个自定义对象作为一个单独的数据类吗?我认为没有一般规则,您可以为每个用例组合几个选项。您可以选择-使用
转换器
并将对象另存为字符串,或者-您可以选择单独的
实体
,并将它们与
房间关系
链接。您可以自定义查询的结果类型,但应该了解,在某些边缘情况下,Room无法理解如何将原始SQLite字段转换为所需的自定义对象。您的用例正是一个房间无法消化的用例(描述了转换#2)。但我不会基于这个用例做出一些一般性的结论。
@Query("SELECT data FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<UserDataList>>