Android 从文件室返回接口的LiveData?

Android 从文件室返回接口的LiveData?,android,persistence,android-room,android-livedata,android-jetpack,Android,Persistence,Android Room,Android Livedata,Android Jetpack,TL;DR版本 我想要一个返回签名为LiveData的方法,其中User是一个接口。实现返回一个LiveData,其中UserEntity是一个扩展User的具体类。例如: fun getUser(id: String): LiveData<User> { // for brevity return LiveData<UserEntity>() // actual code will retrieve data from db } 错误表明 数据类型不匹

TL;DR版本

我想要一个返回签名为
LiveData
的方法,其中
User
是一个接口。实现返回一个
LiveData
,其中
UserEntity
是一个扩展
User
的具体类。例如:

fun getUser(id: String): LiveData<User> {
    // for brevity
    return LiveData<UserEntity>() // actual code will retrieve data from db
}
错误表明
数据类型不匹配:LiveData与LiveData
上述代码不起作用,因为您不能期望函数返回多个数据类型。我建议使用一个用户类来合并Room和GSON映射

@Entity(tableName="users")
data class Users(
  @PrimaryKey           // Room annotation
  @SerializedName("id") // Gson annotation
  val id: String,
  @ColumnInfo(name = "name") 
  @SerializedName("name")   
  val name: String,
  @ColumnInfo(name = "lastName") 
  @SerializedName("lastName")    
  val lastName: String,
)

您可以去掉UserEntity类,将上面的类用作API和DB存储库的DTO。

但这仍然不能消除Web服务对Room的依赖性,不是吗。这样,我就无法在没有空间的情况下对WebService进行单元测试。(以及相互依赖的许多其他缺点)@victl我个人认为这不会影响您的单元测试。这只是一个数据类,您的单元测试将针对您的web服务存储库和本地存储库进行。@victl这是google的示例,采用了与我建议的相同的方法。
@Entity(tableName="users")
data class UserEntity(
    override val id: String
    override val name: String
    override val lastName: String) : User
@Dao
interface UserDao() {
    @Query("SELECT * FROM users where id = :id")
    fun getUser(id: String): LiveData<UserEntity> // UserEntity instead of User, because Room doesn't know how to construct an interface
}
interface DataRepository {
    fun getUser(id: String): LiveData<User>
}
class DbRepository : DataRepository {
    // ... init db connection/userDao ...
    override fun getUser(id: String): LiveData<User> = userDao.getUser(id)
}
@Entity(tableName="users")
data class Users(
  @PrimaryKey           // Room annotation
  @SerializedName("id") // Gson annotation
  val id: String,
  @ColumnInfo(name = "name") 
  @SerializedName("name")   
  val name: String,
  @ColumnInfo(name = "lastName") 
  @SerializedName("lastName")    
  val lastName: String,
)