在 android 中使用带有 DI 的 MVVM 时,是否有任何特定方法可以将 LiveData 转换为 ArrayList,而不使用存储库内的观察者

Saq*_*que 5 android dependency-injection mvvm android-room android-livedata

这是我的问题陈述

**

  • 我在做什么

** 我在我的 android 应用程序中使用带有依赖注入的 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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Firebase源

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
    }

}
Run Code Online (Sandbox Code Playgroud)

Moh*_*aki 2

你可以通过使用来实现这一点Transformations.switchMap()

火存储:

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

行情数据库:

class QuotesDatabase {

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

    fun getQuotes(): LiveData<List<Quote>> {
        return dao.getQuotes()
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库:

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)