I have remote mediator. I get data from Firebase. I insert them in Room db. The problem is that mediator load runs continuously. It gets data and insert over and over. I have only 2 item in the list.
RemoteMediator
@OptIn(ExperimentalPagingApi::class)
class CommunityProgramRemoteMediator(
private val database: CommunityProgramDatabase,
private val firestore: FirebaseFirestore
): RemoteMediator<Int, CommunityProgram>() {
override suspend fun load(
loadType: LoadType,
state: PagingState<Int, CommunityProgram>
): MediatorResult {
return try {
Log.d("load status","run remote mediator 0")
val documentSnapshot = firestore.collection("community-programs")
.whereEqualTo("level",0)
.limit(10)
.get()
.await()
val programs = mutableListOf<CommunityProgram>()
for (program in documentSnapshot) {
val name = program.data["name"] as String
val programDaysQuery = firestore.collection("community-programs")
.document(program.id)
.collection("program-days")
.get()
.await()
val programDayCount = programDaysQuery.documents.size.toString()
val imageUrl = program.data["imageUrl"] as String?
val downloadUrl = imageUrl?.let {
Firebase.storage.reference.child("app-content/images/community-program-images/$it.jpg").downloadUrl.await().toString()
}
val level = program.data["level"] as Long
val owner = program.data["owner"] as String
//val timeStamp = System.currentTimeMillis()
val communityProgram = CommunityProgram(program.id, name, programDayCount, owner, level.toInt(), downloadUrl) //timeStamp
programs.add(communityProgram)
}
database.withTransaction {
if (loadType == LoadType.REFRESH) {
Log.d("load status","run remote mediator 1")
database.communityProgramDao().clearAllPrograms()
}
Log.d("load status","run remote mediator 2")
database.communityProgramDao().upsertAll(programs)
}
MediatorResult.Success(endOfPaginationReached = programs.isEmpty())
} catch (e: Exception) {
MediatorResult.Error(e)
}
}
}
Repo
@OptIn(ExperimentalPagingApi::class)
fun getPrograms(level: Int): Flow<PagingData<CommunityProgram>> {
Log.d("load status","repo 1")
val pagingSourceFactory = { database.communityProgramDao().getProgramsByLevel(level) }
return Pager(
config = PagingConfig(pageSize = 20, enablePlaceholders = false),
remoteMediator = CommunityProgramRemoteMediator(database, db),
pagingSourceFactory = pagingSourceFactory,
).flow
}
Viewmodel
val communityPrograms: StateFlow<PagingData<CommunityProgram>> = _selectedLevel.flatMapLatest { level ->
repo.getPrograms(level).cachedIn(viewModelScope)
}.stateIn(viewModelScope, SharingStarted.Lazily, PagingData.empty())
Screen
val communityPrograms = viewModel.communityPrograms.collectAsLazyPagingItems()