有没有一种方法可以让一个 Room TypeConverter 接受多个表字段并将它们组合成某个对象?
作为示例,假设我有一个表 Foo,其中包含列INT numerator
、INT denominator
(共同表示分数)和INT unit
(单位映射到测量单位的枚举)。我想将它们组合成MyScalar(Fraction(numerator, denominator), unit)
. 例如,可能取一行(1, 5, 2)
(映射2
到 的位置MeasurementUnit.KG
)并使用 a@TypeConverter
将此行转换为MyScalar(Fraction(1,5), MeasurementUnit.KG)
。
现在我只是在做
data class MyEntity(
val numerator: Int,
val denominator: Int,
@TypeConverters(IntAndUnitConverter::class)
val unit: MeasurementUnit
) {
fun combine(): MyScalar {
return MyScalar(Fraction(numerator, denominator), unit)
}
}
Run Code Online (Sandbox Code Playgroud)
和
data class MyScalar(val value: Fraction, val unit: MeasurementUnit)
Run Code Online (Sandbox Code Playgroud)
似乎可以解决这个问题,但我发现这个想法很有吸引力,只需让我的 @Entity 将 @TypeConverters(SomeThreeColumnConverter::class) 放在顶部,而不用担心记住调用 merge() 或类似的东西。
我认为不可能,但想检查一下。
我试图找出通过 Room 按 ID 获取单行的最佳方法。我已经从指南中复制了有关如何获取实体中的所有行(Workout
以及所有连接的实体)的代码,这对于填充回收器视图非常有用。
但是,当前,当我需要深入了解一个时,我在存储库中的猜测代码是
@WorkerThread
suspend fun getWorkoutById(id: Long): LiveData<WorkoutTree> {
return workoutDao.getWorkoutById(id)
}
Run Code Online (Sandbox Code Playgroud)
在 DAO 中
@Transaction
@Query("SELECT * FROM WORKOUTS WHERE id=:id")
fun getWorkoutById(id: Long): LiveData<WorkoutTree>
Run Code Online (Sandbox Code Playgroud)
当然,我repository.getWorkoutById(myId)
从我的 ViewModel 调用,这样我就可以填充数据并从我的 Activity/Fragment 引用它。
但我试图弄清楚我是否走在正确的轨道上,以及获取这个的最佳方式。老实说,它是手机本地的数据库,因此不应该存在需要实时更新的问题。
直接序列化 Recyclerview 中列出的所有行中点击的对象并将其传递到我的活动中而不用费心通过 ID 获取会更好吗?
几乎我在网上找到的有关 Room 和 Android 开发的每个示例都提供了获取所有行并使用 LiveData 的示例,并且存储库具有一个公共属性 LiveData>,该属性由从实体中获取所有行的初始 DAO 填充。
我很难在心理上将这个例子翻译成只获取一行的例子。
我实际上没有任何功能代码可以分享,因为我无法真正弄清楚如何在 Kotlin 和 Room 等中构建它。我以前从未编写过 Android 应用程序,并且拥有 Python、JS、Scala 的函数式编程背景,因此我很困惑 Kotlin 指南和 Android 指南如何建议您使用用于解耦所有内容的所有附加类和接口来完成此操作。电话应用程序。
我的Android应用程序有一个Room数据库。我的FooDao和BarDao都实现了BaseDao:
interface BaseDao<T> {
@Insert
fun insert(obj: T): Long
@Update
fun update(obj: T)
}
@Dao
interface FooDao: BaseDao<FooEntity> {
@Query("some query")
fun doSomethingWithFoo()
}
@Dao
interface BarDao: BaseDao<BaseEntity> {
@Query("some other query")
fun doSomethingWithBar()
}
Run Code Online (Sandbox Code Playgroud)
我也有一个存储库类:
class MyRepo(private val fooDao: FooDao, private val barDao: BarDao) {
fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
fun doSomethingWithBar() = barDao.doSomethingWithBar()
}
Run Code Online (Sandbox Code Playgroud)
但是,可以想象FooDao,BarDao和MyRepo不仅具有这两个功能。
我已经了解了有关类委托以启用组合继承的知识。因此,我试图通过让MyRepo委托简单的函数来减少MyRepo的样板,这些简单函数仅调用dao的函数并返回dao的返回值。我应该这样做:
class MyRepo(...): FooDao by fooDao, BarDao by barDao {
//fun doSomethingWithFoo no longer necessary
//fun doSomethingWithBar no longer necessary
}
Run Code Online (Sandbox Code Playgroud)
但是,Android Studio却让我措手不及 Type …
我正在尝试学习 Arrow 库并通过将我的一些 Android Kotlin 代码从命令式风格转换为函数式风格来改进我的函数式编程。我一直在应用程序中进行一种 MVI 编程,以使测试更简单。
我的视图模型有一个LiveData
视图状态加上一个公共方法来将用户交互从视图传递到视图模型,因此视图模型可以以任何合适的方式更新状态。
class MyViewModel: ViewModel() {
val state = MutableLiveData(MyViewState()) // MyViewState is a data class with relevant data
fun instruct(intent: MyIntent) { // MyIntent is a sealed class of data classes representing user interactions
return when(intent) {
is FirstIntent -> return viewModelScope.launch(Dispatchers.IO) {
val result = myRoomRepository.suspendFunctionManipulatingDatabase(intent.myVal)
updateStateWithResult(result)
}.run { Unit }
is SecondIntent -> return updateStateWithResult(intent.myVal)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Activity 订阅 ,LiveData
并且在状态更改时,它使用该状态运行渲染函数。该活动还将用户交互作为意图传递给视图模型(不要与 Android 的 …
android functional-programming io-monad arrow-kt kotlin-coroutines