Есть ли какой-то конкретный способ конвертировать LiveData в ArrayList без использования наблюдателя внутри хранилища при использовании MVVM с DI в Android - PullRequest
0 голосов
/ 08 ноября 2019

Итак, вот мое постановление проблемы

**

  • Что я делаю

** Я использую MVVM с внедрением зависимостей в моемпоэтому у меня есть репозиторий, в котором я в основном извлекаю данные из firebase и возвращаю живые данные в репозиторий, но теперь я просто интегрировал базу данных комнаты в свой проект, и здесь возникает реальная проблема,

**

  • чего я хотел добиться

** Я хочу сохранить данные, поступающие с сервера, в базу данных локальной комнаты и в качествеMVVM предлагает в качестве шаблона проектирования, мне нужно для этой задачи внутри хранилища

**

  • Вот эта проблема лежит

** ДанныеПриходя в форму хранилища, класс firebase - это живые данные, и мне нужно сохранить эти данные в базе данных комнаты, но я не знаю, как преобразовать живые данные в ArrayList данных для хранения данных в комнате, используя класс DAO, которого я знаю. некоторые из васскажет, что заставил наблюдателя наблюдать данные в хранилище, но учтите, что я не передаю контекст хранилищу

**

  • Код хранилища

**

package com.baymax.quotesapplication.data

import android.os.AsyncTask
import androidx.lifecycle.LiveData
import com.baymax.quotesapplication.data.db.QuoteDao
import com.baymax.quotesapplication.data.db.QuotesDatabase
import com.baymax.quotesapplication.data.db.entity.Quote

class QuoteRepository private constructor(private val firestoreSource: FirestoreSource,
                                          private val database: QuotesDatabase,
                                          private val status:String){

    fun addQuotes(quote:Quote)
    {
        InsertNoteAsyncTask(
            database.getQuoteDao()
        ).execute(quote)
        firestoreSource.addQuotes(quote)
    }

    fun getQuotes():LiveData<List<Quote>>
    {
        if(status.equals("ONLINE"))
        {
            return firestoreSource.getQuotes()
        }
        return database.getQuoteDao().getQuotes()
    }

    fun deleteAllNotes() {
        DeleteAllNotesAsyncTask(
            database.getQuoteDao()
        ).execute()
    }

    companion object {
        // Singleton instantiation you already know and love
        @Volatile private var instance: QuoteRepository? = null

        fun getInstance(firestoreSource: FirestoreSource,database: QuotesDatabase,status: String) =
            instance ?: synchronized(this) {
                instance ?: QuoteRepository(firestoreSource,database,status).also { instance = it }
            }
    }

    private class InsertNoteAsyncTask(val quoteDao: QuoteDao) : AsyncTask<Quote, Unit, Unit>() {

        override fun doInBackground(vararg quote: Quote?) {
            quoteDao.addQuote(quote[0]!!)
        }
    }


    private class DeleteAllNotesAsyncTask(val quoteDao: QuoteDao) : AsyncTask<Unit, Unit, Unit>() {

        override fun doInBackground(vararg p0: Unit?) {
            quoteDao.deleteAllNotes()
        }
    }
}

FirebaseSource

class FirestoreSource (){

    private val firestore:FirebaseFirestore by lazy {
        FirebaseFirestore.getInstance()
    }

    private val quoteList = mutableListOf<Quote>()
    private val quotes = MutableLiveData<List<Quote>>()

    init {
        quotes.value = quoteList
    }

    fun addQuotes(quote:Quote)
    {
        val map:HashMap<String,String> = HashMap<String,String>()
        map.put("Quote",quote.quote)
        map.put("Author",quote.author)
        firestore.collection("Quotes").add(map as Map<String, Any>).addOnCompleteListener {
            quoteList.add(quote)
            quotes.value = quoteList
        }
    }

    fun getQuotes(): LiveData<List<Quote>>
    {
        firestore.collection("Quotes").get().addOnCompleteListener { task ->
            if (task.isSuccessful)
            {
                quoteList.clear()
                for (quote in task.result!!)
                {
                    quoteList.add(Quote(quote.get("Quote").toString(),quote.get("Author").toString()))
                }
                Log.d("EVENT","Live Data is updated")
            }
        }
        quotes.value = quoteList
        return quotes
    }

}

1 Ответ

0 голосов
/ 08 ноября 2019

Этого можно добиться, используя Transformations.switchMap()

FireStore:

class FirestoreSource {
    fun getQuotes(): LiveData<List<Quote>> {
        // fetch data here and return live data
    }
}

База данных Quotes:

class QuotesDatabase {

    fun saveQuotesInDb(quotes: List<Quote>) {
        // save in db here
    }

    fun getQuotes(): LiveData<List<Quote>> {
        return dao.getQuotes()
    }
}

Репозиторий:

class Repository(
    private val firestoreSource: FirestoreSource,
    private val database: QuotesDatabase
) {
    fun getQuotes(): LiveData<List<Quote>> {
        return Transformations.switchMap(firestoreSource.getQuotes()) {
            database.saveQuotesInDb(it)
            database.getQuotes()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...