Android 从文件室返回接口的LiveData?
TL;DR版本 我想要一个返回签名为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 } 错误表明 数据类型不匹
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,
)