separating room accesor and migration code

This commit is contained in:
MohitMaliFtechiz 2023-05-15 15:48:23 +05:30 committed by Kelson
parent 1bd468fd58
commit 954c4f5d55
5 changed files with 23 additions and 27 deletions

View File

@ -22,11 +22,8 @@ import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import org.kiwix.kiwixmobile.core.BuildConfig
import org.kiwix.kiwixmobile.core.dao.RecentSearchRoomDao
import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchRoomEntity
import org.kiwix.kiwixmobile.core.data.remote.FdroidDatabaseCallback
import org.kiwix.kiwixmobile.core.data.remote.RoomDatabaseCallback
@Suppress("UnnecessaryAbstractClass")
@Database(entities = [RecentSearchRoomEntity::class], version = 1)
@ -36,16 +33,11 @@ abstract class KiwixRoomDatabase : RoomDatabase() {
companion object {
private var db: KiwixRoomDatabase? = null
fun getInstance(context: Context): KiwixRoomDatabase {
val callback =
if (BuildConfig.BUILD_TYPE != "fdroid")
RoomDatabaseCallback(context)
else FdroidDatabaseCallback()
return db ?: synchronized(KiwixRoomDatabase::class) {
return@getInstance db
?: Room.databaseBuilder(context, KiwixRoomDatabase::class.java, "KiwixRoom.db")
// We have already database name called kiwix.db in order to avoid complexity we named as
// kiwixRoom.db
.addCallback(callback)
.build()
}
}

View File

@ -18,43 +18,39 @@
package org.kiwix.kiwixmobile.core.data.remote
import android.content.Context
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import io.objectbox.Box
import io.objectbox.BoxStore
import io.objectbox.kotlin.boxFor
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.kiwix.kiwixmobile.core.BuildConfig
import org.kiwix.kiwixmobile.core.CoreApp
import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchEntity
import org.kiwix.kiwixmobile.core.data.KiwixRoomDatabase
import javax.inject.Inject
class RoomDatabaseCallback(val context: Context) :
RoomDatabase.Callback() {
class ObjectBoxToRoomMigrator {
@Inject lateinit var kiwixRoomDatabase: KiwixRoomDatabase
@Inject lateinit var boxStore: BoxStore
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
CoreApp.coreComponent.inject(this)
boxStore.let(::migrateRecentSearch)
init {
// Migrate data for non-fdroid variant
if (BuildConfig.BUILD_TYPE != "fdroid") {
CoreApp.coreComponent.inject(this)
migrateRecentSearch(boxStore.boxFor())
// TODO we will migrate here for other entities
}
}
fun migrateRecentSearch(boxStore: BoxStore) {
migrationToRoomInsert(boxStore.boxFor())
}
private fun migrationToRoomInsert(
box: Box<RecentSearchEntity>
) {
private fun migrateRecentSearch(box: Box<RecentSearchEntity>) {
val searchRoomEntityList = box.all
searchRoomEntityList.forEachIndexed { _, recentSearchEntity ->
CoroutineScope(Dispatchers.IO).launch {
kiwixRoomDatabase.recentSearchRoomDao()
.saveSearch(recentSearchEntity.searchTerm, recentSearchEntity.zimId)
// Todo Should we remove object store data now?
// removing the single entity from the object box after migration.
box.remove(recentSearchEntity.id)
}
}
}

View File

@ -37,7 +37,7 @@ import org.kiwix.kiwixmobile.core.dao.RecentSearchRoomDao
import org.kiwix.kiwixmobile.core.data.DataModule
import org.kiwix.kiwixmobile.core.data.DataSource
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
import org.kiwix.kiwixmobile.core.data.remote.RoomDatabaseCallback
import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator
import org.kiwix.kiwixmobile.core.di.modules.ApplicationModule
import org.kiwix.kiwixmobile.core.di.modules.CoreViewModelModule
import org.kiwix.kiwixmobile.core.di.modules.JNIModule
@ -94,6 +94,7 @@ interface CoreComponent {
fun newBookmarksDao(): NewBookmarksDao
fun connectivityManager(): ConnectivityManager
fun recentSearchRoomDao(): RecentSearchRoomDao
fun objectBoxToRoomMigrator(): ObjectBoxToRoomMigrator
fun context(): Context
fun downloader(): Downloader
@ -106,7 +107,7 @@ interface CoreComponent {
fun inject(errorActivity: ErrorActivity)
fun inject(searchFragment: SearchFragment)
fun inject(roomDatabaseCallback: RoomDatabaseCallback)
fun inject(objectBoxToRoomMigrator: ObjectBoxToRoomMigrator)
fun inject(settingsFragment: CoreSettingsFragment)
fun coreServiceComponent(): CoreServiceComponent.Builder

View File

@ -29,6 +29,7 @@ import io.reactivex.Scheduler
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.kiwix.kiwixmobile.core.NightModeConfig
import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator
import org.kiwix.kiwixmobile.core.di.qualifiers.Computation
import org.kiwix.kiwixmobile.core.di.qualifiers.IO
import org.kiwix.kiwixmobile.core.di.qualifiers.MainThread
@ -65,6 +66,10 @@ class ApplicationModule {
@Singleton
internal fun provideBookUtils(): BookUtils = BookUtils()
@Provides
@Singleton
fun provideObjectBoxToRoomMigrator() = ObjectBoxToRoomMigrator()
@IO
@Provides
fun provideIoThread(): Scheduler = Schedulers.io()

View File

@ -40,6 +40,7 @@ import org.kiwix.kiwixmobile.core.BuildConfig
import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator
import org.kiwix.kiwixmobile.core.di.components.CoreActivityComponent
import org.kiwix.kiwixmobile.core.error.ErrorActivity
import org.kiwix.kiwixmobile.core.extensions.browserIntent
@ -78,6 +79,7 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
abstract val cachedComponent: CoreActivityComponent
abstract val topLevelDestinations: Set<Int>
abstract val navHostContainer: FragmentContainerView
@Inject lateinit var objectBoxToRoomMigrator: ObjectBoxToRoomMigrator
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.KiwixTheme)