Migrate to SQLite Driver APIs

This commit is contained in:
FooIbar committed 2025-11-29 15:08:24 +08:00
1 parent 71291b8800
commit 99696b11db
7 files changed
+41 -18

No files matched your search

@@ -39,6 +39,7 @@ import coil3.request.crossfade
import coil3.serviceLoaderEnabled
import coil3.util.DebugLogger
import com.ehviewer.core.database.SearchDatabase
import com.ehviewer.core.database.roomDb
import com.ehviewer.core.files.deleteContent
import com.ehviewer.core.ui.util.initSETConnection
import com.ehviewer.core.util.isAtLeastO
@@ -83,7 +84,6 @@ import logcat.LogPriority
import logcat.LogcatLogger
import logcat.asLog
import okio.Path.Companion.toOkioPath
import splitties.arch.room.roomDb
import splitties.init.appCtx
private val lifecycle = ProcessLifecycleOwner.get().lifecycle
+10 -11
View File
@@ -15,13 +15,12 @@
*/
package com.hippo.ehviewer
import android.content.Context
import android.net.Uri
import arrow.fx.coroutines.resource
import arrow.fx.coroutines.resourceScope
import com.ehviewer.core.data.model.asEntity
import com.ehviewer.core.database.EhDatabase
import com.ehviewer.core.database.Schema17to18
import com.ehviewer.core.database.getDatabasePath
import com.ehviewer.core.database.model.DownloadArtist
import com.ehviewer.core.database.model.DownloadDirname
import com.ehviewer.core.database.model.DownloadInfo
@@ -32,13 +31,13 @@ import com.ehviewer.core.database.model.HistoryInfo
import com.ehviewer.core.database.model.LocalFavoriteInfo
import com.ehviewer.core.database.model.ProgressInfo
import com.ehviewer.core.database.model.QuickSearch
import com.ehviewer.core.database.roomDb
import com.ehviewer.core.files.delete
import com.ehviewer.core.files.sendTo
import com.ehviewer.core.model.GalleryInfo
import com.hippo.ehviewer.download.DownloadManager
import kotlinx.coroutines.flow.Flow
import okio.Path
import okio.Path.Companion.toOkioPath
import splitties.arch.room.roomDb
object EhDB {
private const val DB_NAME = "eh.db"
@@ -277,23 +276,23 @@ object EhDB {
db.filterDao().update(filter)
}
fun exportDB(context: Context, file: Path) {
fun exportDB(file: Path) {
db.query("PRAGMA wal_checkpoint(FULL)", null).use { it.moveToNext() }
val dbFile = context.getDatabasePath(DB_NAME)
dbFile.toOkioPath() sendTo file
val dbFile = getDatabasePath(DB_NAME)
dbFile sendTo file
}
suspend fun importDB(context: Context, uri: Uri) = resourceScope {
suspend fun importDB(file: Path) = resourceScope {
val tempDBName = "tmp.db"
val dbFile = getDatabasePath(tempDBName)
file sendTo dbFile
val oldDB = resource {
context.deleteDatabase(tempDBName)
roomDb<EhDatabase>(tempDBName) {
createFromInputStream { context.contentResolver.openInputStream(uri) }
addMigrations(Schema17to18())
}
} release { db ->
db.close()
context.deleteDatabase(tempDBName)
dbFile.delete()
}
db.galleryDao().insertOrIgnore(oldDB.galleryDao().list())
@@ -123,7 +123,7 @@ fun AnimatedVisibilityScope.AboutScreen(navigator: DestinationsNavigator) = Scre
}
}
context(ctx: Context, _: DialogState)
context(_: Context, _: DialogState)
suspend fun showNewVersion(release: Release) {
awaitConfirmationOrCancel(
confirmText = R.string.download,
@@ -140,7 +140,7 @@ suspend fun showNewVersion(release: Release) {
}
if (Settings.backupBeforeUpdate.value) {
val time = ReadableTime.getFilenamableTime()
EhDB.exportDB(ctx, (downloadLocation / "$time.db"))
EhDB.exportDB(downloadLocation / "$time.db")
}
// TODO: Download in the background and show progress in notification
val path = AppConfig.tempDir / "update.apk"
@@ -96,13 +96,13 @@ private fun dumplog(uri: Uri): Unit = with(ctx) {
context(ctx: Context)
private fun exportDatabase(uri: Uri) {
ctx.grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
EhDB.exportDB(ctx, uri.toOkioPath())
EhDB.exportDB(uri.toOkioPath())
}
context(ctx: Context)
private suspend fun importDatabase(uri: Uri) {
ctx.grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
EhDB.importDB(ctx, uri)
EhDB.importDB(uri.toOkioPath())
}
@Destination<RootGraph>
@@ -0,0 +1,14 @@
package com.ehviewer.core.database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.driver.AndroidSQLiteDriver
import okio.Path.Companion.toOkioPath
import splitties.init.appCtx
actual inline fun <reified T : RoomDatabase> roomDb(
name: String,
builder: RoomDatabase.Builder<T>.() -> Unit,
) = Room.databaseBuilder<T>(appCtx, name).setDriver(AndroidSQLiteDriver()).apply(builder).build()
actual fun getDatabasePath(name: String) = appCtx.getDatabasePath(name).toOkioPath()
@@ -0,0 +1,11 @@
package com.ehviewer.core.database
import androidx.room.RoomDatabase
import okio.Path
expect inline fun <reified T : RoomDatabase> roomDb(
name: String,
builder: RoomDatabase.Builder<T>.() -> Unit = {},
): T
expect fun getDatabasePath(name: String): Path
+1 -2
View File
@@ -118,7 +118,6 @@ serialization-xml = { module = "io.github.pdvrieze.xmlutil:serialization", versi
serialization-xml-io = { module = "io.github.pdvrieze.xmlutil:serialization-io", version.ref = "xmlutil" }
splitties-appctx = { module = "com.louiscad.splitties:splitties-appctx", version.ref = "splitties" }
splitties-arch-room = { module = "com.louiscad.splitties:splitties-arch-room", version.ref = "splitties" }
splitties-systemservices = { module = "com.louiscad.splitties:splitties-systemservices", version.ref = "splitties" }
telephoto-zoomable = { module = "me.saket.telephoto:zoomable", version.ref = "telephoto" }
@@ -136,7 +135,7 @@ spotless-gradlePlugin = { module = "com.diffplug.spotless:spotless-plugin-gradle
arrow = ["arrow-fx-coroutines", "arrow-functions", "arrow-resilience"]
coil = ["coil-compose", "coil-gif", "coil-network"]
kotlinx-serialization = ["serialization-cbor", "serialization-json", "serialization-json-io", "serialization-xml", "serialization-xml-io"]
splitties = ["splitties-appctx", "splitties-arch-room", "splitties-systemservices"]
splitties = ["splitties-appctx", "splitties-systemservices"]
[plugins]
aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" }