android - 我应该将 MVVM 的哪个部分存储在数据库中
问题描述
我刚刚了解了 MVVM 和注入,我想知道我应该将这个结构的哪一部分存储在数据库中
kotlin 中 mvvm 的简单实现是:
QuotesActivity
class QuotesActivity : AppCompatActivity(), KodeinAware {
override val kodein by closestKodein()
private val viewModelFactory: QuotesViewModelFactory by instance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quotes)
initializeUi()
}
private fun initializeUi() {
val viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(QuotesViewModel::class.java)
viewModel.getQuotes().observe(this, Observer { quotes ->
..
textView_quotes.text = stringBuilder.toString()
})
// When button is clicked, instantiate a Quote and add it to DB through the ViewModel
button_add_quote.setOnClickListener {
..
}
}
}
QuotesViewModel
class QuotesViewModel(private val quoteRepository: QuoteRepository)
: ViewModel() {
fun addQuote(quote: Quote) = quoteRepository.addQuote(quote)
fun getQuotes() = quoteRepository.getQuotes()
}
QuotesViewModelFactory
班级
class QuotesViewModelFactory(private val quoteRepository: QuoteRepository)
: ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return QuotesViewModel(quoteRepository) as T
}
}
Database
interface Database {
val quoteDao: QuoteDao
}
DatabaseFakeImpl
class DatabaseFakeImpl : Database {
override val quoteDao: QuoteDao = QuoteDaoFakeImpl()
}
QuoteDao
界面
interface QuoteDao {
fun addQuote(quote: Quote)
fun getQuotes(): LiveData<List<Quote>>
}
QuoteDaoFakeImpl
班级:
class QuoteDaoFakeImpl : QuoteDao {
private val quoteList = mutableListOf<Quote>()
private val quotes = MutableLiveData<List<Quote>>()
init {
quotes.value = quoteList
}
override fun addQuote(quote: Quote) {
quoteList.add(quote)
quotes.value = quoteList
}
override fun getQuotes() = quotes as LiveData<List<Quote>>
}
Quote
模型类
data class Quote(val text: String, val author: String) {
override fun toString(): String {
return "$text - $author"
}
}
QuoteRepository
interface QuoteRepository {
fun addQuote(quote: Quote)
fun getQuotes(): LiveData<List<Quote>>
}
QuoteRepositoryImpl
class QuoteRepositoryImpl(private val quoteDao: QuoteDao)
: QuoteRepository {
override fun addQuote(quote: Quote) {
quoteDao.addQuote(quote)
}
override fun getQuotes() = quoteDao.getQuotes()
}
我认为这应该在QuoteDaoFakeImpl
简单的类上实现middleware
,例如:
class QuoteDaoFakeImpl : QuoteDao {
...
override fun addQuote(quote: Quote) {
quoteList.add(quote)
quotes.value = quoteList
/* IN THIS PART OF CODE */
}
override fun getQuotes() = quotes as LiveData<List<Quote>>
}
解决方案
主要是 ViewModel。因为它是负责检索和显示数据的层。它也可以保存和加载它。
但更好的实现方式是将数据库操作分离到单独的逻辑层,在将数据推送到 ViewModel 之前,可以在其中检索和保存数据。
推荐阅读
- woocommerce - Woocommerce 根据变化获取脚本数据并在需要时突出显示下拉字段
- java - Android OS11,无法使用隐式意图共享文件
- javascript - 在javascript中将指纹添加到PDF
- android - Kotlin HTTP 请求
- javascript - 我不知道可迭代是什么意思
- firebase - 如何将 Flutter 项目迁移到 Firebase 版本 9 现代 Web 模块化风格
- excel - 使用 Excel VBA 的 FILTER 函数仅生成一行数据而不是列表。为什么要添加“@”(此行)符号?我怎样才能防止这种情况?
- javascript - 如何在没有 navigator.platform 的情况下确定浏览器平台
- javascript - 如何使用javascript在plotly中旋转数据点的文本标签
- python - 如何使用 Pydantic 为一个字段定义两个值类型