在 ViewModel 内部,使用改造,我以标准方式获取数据
fun getUsers() = liveData(Dispatchers.IO) {
emit(Resource.loading(data = null))
try {
emit(Resource.success(data = nalRepository.getNal()))
} catch (exception: Exception) {
emit(Resource.error(data = null, message = exception.message ?: "Error Occurred!"))
}
}
是否可以在将这些数据返回到 liveData 之前将其保存到数据库中
private val db = AppDatabase.getInstance(getApplication())
private val dao = db!!.CurrencyDao()
private val service = Executors.newFixedThreadPool(1)
fun addListBook(list: List<Currency>)
{
service.submit {
dao.insertList(list)
}
service.shutdown()
}
我addListBook()在订阅 liveData 时已经保存在 Fragment 中,但是直接在 ViewModel 中执行会更合乎逻辑,但不清楚如何爬emit(Resource.success(data = nalRepository.getNal()))取并将其发送到数据库。也就是说,它不起作用
//Получить данные
var list = emit(Resource.success(data = nalRepository.getNal()))
//Сохранить в базу
addListBook(list)
我使用类似这样的架构:
视图模型
存储库
远程存储库
得到结果
API服务
LiveData 扩展
类 - 包装器
其实有很多用例:
即使在这个版本中,也有很多方法。例如,您可以先从数据库中进行选择,使缓存的数据可见,然后仅发出请求,将更新的数据插入数据库,并由 LiveData 更新。
您可以将插入和删除旧数据合并到一个事务中。
很多用例。
我们可能应该争取清洁架构。据她介绍,所有应用程序都应该分层。不应该依赖于数据库和外部服务,因此您需要添加 2 个以上的抽象级别(例如 LocalRepository (db) 和 RemoteRepository(外部服务)
如果我正确理解您的问题,那么
Transformation. 这是一个例子:PS。我被你的 liveData 弄糊涂了——我以为它是一个返回类型,但现在我意识到这是 coroutineScope 的名称。
那么你应该以不同的方式做事。
你可以写这样的东西
一般来说,您可以在这里删除泛型并替换您自己的类型,这样会更容易,但这种解决方案是通用的。
在您从改造中获得响应的地方,您可以执行以下操作:
因此,在 ViewModel 中,您将已经收到错误或成功的结果。在 ViewModel 中你像这样处理它