首页 > 解决方案 > 我应该将 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>>
}

标签: androidandroid-mvvm

解决方案


主要是 ViewModel。因为它是负责检索和显示数据的层。它也可以保存和加载它。

但更好的实现方式是将数据库操作分离到单独的逻辑层,在将数据推送到 ViewModel 之前,可以在其中检索和保存数据。


推荐阅读