diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index ce395ad1c..c6f7dc3dd 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -99,6 +99,9 @@ class OfflineFirstNewsRepository @Inject constructor( niaPreferencesDataSource.setNewsResourcesViewed(changedIds, true) } + // Fetch all the cross references + val allCrossReferences = newsResourceDao.fetchAllCrossReferences() + // Obtain the news resources which have changed from the network and upsert them locally changedIds.chunked(SYNC_BATCH_SIZE).forEach { chunkedIds -> val networkNewsResources = network.getNewsResources(ids = chunkedIds) @@ -116,12 +119,22 @@ class OfflineFirstNewsRepository @Inject constructor( NetworkNewsResource::asEntity, ), ) + + val dataDiff = allCrossReferences.subtract( + networkNewsResources.map(NetworkNewsResource::topicCrossReferences) + .distinct() + .flatten() + .toSet() + ) + newsResourceDao.insertOrIgnoreTopicCrossRefEntities( newsResourceTopicCrossReferences = networkNewsResources .map(NetworkNewsResource::topicCrossReferences) .distinct() .flatten(), ) + + newsResourceDao.deleteCrossReferences(dataDiff.toList()) } if (hasOnboarded) { diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt index 0ad1e4f7d..ac3f43edd 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid.core.database.dao import androidx.room.Dao +import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query @@ -113,6 +114,12 @@ interface NewsResourceDao { newsResourceTopicCrossReferences: List, ) + @Query("SELECT * from news_resources_topics") + suspend fun fetchAllCrossReferences(): List + + @Delete + suspend fun deleteCrossReferences(list: List) + /** * Deletes rows in the db matching the specified [ids] */