在 android 中使用带有 DI 的 MVVM 时,是否有任何特定的方法可以将 LiveData 转换为 ArrayList 而无需使用存储库内的观察者
Is there any specific way to convert the LiveData to ArrayList without using the observer inside the repository while using MVVM with DI in android
这是我的问题陈述
**
- 我在做什么
**
我在我的 android 应用程序中使用依赖注入的 MVVM,因此,我有存储库,我基本上在其中从 firebase 获取数据并将实时数据返回到存储库,但现在我只是集成了房间数据库到我的项目,真正的问题来了,
**
- 我想达到的目标
**
我想将来自服务器的数据存储到本地房间数据库中,正如 MVVM 建议的设计模式,我需要在存储库中完成此任务
**
- 问题就出在这里
**
从 firebase class 进入存储库的数据是实时数据,我需要将此数据存储到房间数据库,但我不知道如何将实时数据转换为数据的 ArrayList 以将数据存储到使用 DAO 的房间 class
我知道你们中的一些人会说设置一个观察者来观察存储库中的数据,但请注意这一点,我没有将上下文传递给存储库
**
- 存储库代码
**
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
}
}
您可以通过使用 Transformations.switchMap()
来实现
FireStore:
class FirestoreSource {
fun getQuotes(): LiveData<List<Quote>> {
// fetch data here and return live data
}
}
行情数据库:
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()
}
}
}
这是我的问题陈述
**
- 我在做什么
** 我在我的 android 应用程序中使用依赖注入的 MVVM,因此,我有存储库,我基本上在其中从 firebase 获取数据并将实时数据返回到存储库,但现在我只是集成了房间数据库到我的项目,真正的问题来了,
**
- 我想达到的目标
** 我想将来自服务器的数据存储到本地房间数据库中,正如 MVVM 建议的设计模式,我需要在存储库中完成此任务
**
- 问题就出在这里
** 从 firebase class 进入存储库的数据是实时数据,我需要将此数据存储到房间数据库,但我不知道如何将实时数据转换为数据的 ArrayList 以将数据存储到使用 DAO 的房间 class 我知道你们中的一些人会说设置一个观察者来观察存储库中的数据,但请注意这一点,我没有将上下文传递给存储库
**
- 存储库代码
**
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
}
}
您可以通过使用 Transformations.switchMap()
FireStore:
class FirestoreSource {
fun getQuotes(): LiveData<List<Quote>> {
// fetch data here and return live data
}
}
行情数据库:
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()
}
}
}