В какой части MVVM я должен хранить данные в базе данных - PullRequest
1 голос
/ 18 апреля 2019

Я только что узнал о MVVM и инъекциях, и я хотел бы знать, какой частью этой структуры я должен хранить данные в базе данных

Простая реализация mvvm в kotlin:

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>>
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вы должны хранить данные в репозитории.Он должен запрашивать и вставлять в источники данных, такие как Room.

0 голосов
/ 18 апреля 2019

В основном это ViewModel. Поскольку именно слой отвечает за получение и отображение данных. Он также может сохранить и загрузить его.

Но даже лучшей реализацией было бы разделение операций базы данных на отдельном слое логики, где данные могут быть извлечены и сохранены перед их отправкой в ​​ViewModel.

...