Я только что узнал о 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>>
}