From 8c480c6355d482ff25f4b81098a83988448d5631 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:08:40 +0600 Subject: [PATCH] Switch to AndroidX bundled sqlite driver (#3082) --- app/build.gradle.kts | 2 +- .../java/eu/kanade/tachiyomi/di/AppModule.kt | 40 ++++++------------- gradle/androidx.versions.toml | 3 ++ gradle/libs.versions.toml | 10 +---- 4 files changed, 18 insertions(+), 37 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 85796d2fa..e88b5c83f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -200,7 +200,7 @@ dependencies { implementation(androidx.paging.runtime) implementation(androidx.paging.compose) - implementation(libs.bundles.sqlite) + implementation(androidx.sqlite.bundled) implementation(kotlinx.reflect) implementation(kotlinx.immutables) diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 9997a0711..c243d9568 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -1,14 +1,15 @@ package eu.kanade.tachiyomi.di import android.app.Application -import android.os.Build import androidx.core.content.ContextCompat -import androidx.sqlite.db.SupportSQLiteDatabase -import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory +import androidx.sqlite.driver.bundled.BundledSQLiteDriver import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.android.AndroidSqliteDriver +import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteConfiguration +import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDatabaseType +import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDriver +import com.eygraber.sqldelight.androidx.driver.File +import com.eygraber.sqldelight.androidx.driver.FileProvider import eu.kanade.domain.track.store.DelayedTrackingStore -import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.download.DownloadCache @@ -20,7 +21,6 @@ import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.network.JavaScriptEngine import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.AndroidSourceManager -import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import kotlinx.serialization.protobuf.ProtoBuf import nl.adaptivity.xmlutil.XmlDeclMode @@ -51,29 +51,13 @@ class AppModule(val app: Application) : InjektModule { addSingleton(app) addSingletonFactory { - AndroidSqliteDriver( + AndroidxSqliteDriver( + driver = BundledSQLiteDriver(), + databaseType = AndroidxSqliteDatabaseType.FileProvider(app, "tachiyomi.db"), schema = Database.Schema, - context = app, - name = "tachiyomi.db", - factory = if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - // Support database inspector in Android Studio - FrameworkSQLiteOpenHelperFactory() - } else { - RequerySQLiteOpenHelperFactory() - }, - callback = object : AndroidSqliteDriver.Callback(Database.Schema) { - override fun onOpen(db: SupportSQLiteDatabase) { - super.onOpen(db) - setPragma(db, "foreign_keys = ON") - setPragma(db, "journal_mode = WAL") - setPragma(db, "synchronous = NORMAL") - } - private fun setPragma(db: SupportSQLiteDatabase, pragma: String) { - val cursor = db.query("PRAGMA $pragma") - cursor.moveToFirst() - cursor.close() - } - }, + configuration = AndroidxSqliteConfiguration( + isForeignKeyConstraintsEnabled = true, + ), ) } addSingletonFactory { diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 863c1d0b9..43296b647 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -3,6 +3,7 @@ agp_version = "8.13.2" lifecycle_version = "2.10.0" paging_version = "3.4.2" interpolator_version = "1.0.0" +sqlite = "2.6.2" [libraries] gradle = { module = "com.android.tools.build:gradle", version.ref = "agp_version" } @@ -33,5 +34,7 @@ test-ext = "androidx.test.ext:junit-ktx:1.3.0" test-espresso-core = "androidx.test.espresso:espresso-core:3.7.0" test-uiautomator = "androidx.test.uiautomator:uiautomator:2.3.0" +sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } + [bundles] lifecycle = ["lifecycle-common", "lifecycle-process", "lifecycle-runtimektx"] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc6226e9f..da83e7fc9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,6 @@ moko = "0.26.1" okhttp_version = "5.3.2" shizuku_version = "13.1.5" sqldelight = "2.3.2" -sqlite = "2.6.2" voyager = "1.1.0-beta03" spotless = "8.3.0" ktlint-core = "1.8.0" @@ -36,10 +35,6 @@ disklrucache = "com.jakewharton:disklrucache:2.0.2" unifile = "com.github.tachiyomiorg:unifile:e0def6b3dc" libarchive = "me.zhanghai.android.libarchive:library:1.1.6" -sqlite-framework = { module = "androidx.sqlite:sqlite-framework", version.ref = "sqlite" } -sqlite-ktx = { module = "androidx.sqlite:sqlite-ktx", version.ref = "sqlite" } -sqlite-android = "com.github.requery:sqlite-android:3.49.0" - preferencektx = "androidx.preference:preference-ktx:1.2.1" injekt = "com.github.mihonapp:injekt:91edab2317" @@ -84,7 +79,7 @@ shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizu leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref = "leakcanary" } -sqldelight-android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } +sqldelight-androidx-driver = { module = "com.eygraber:sqldelight-androidx-driver", version = "0.0.17" } sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions-jvm", version.ref = "sqldelight" } sqldelight-android-paging = { module = "app.cash.sqldelight:androidx-paging3-extensions", version.ref = "sqldelight" } sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", version.ref = "sqldelight" } @@ -119,10 +114,9 @@ firebase-crashlytics = { id = "com.google.firebase.crashlytics", version = "3.0. [bundles] okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"] js-engine = ["quickjs-android"] -sqlite = ["sqlite-framework", "sqlite-ktx", "sqlite-android"] coil = ["coil-core", "coil-gif", "coil-compose", "coil-network-okhttp"] shizuku = ["shizuku-api", "shizuku-provider"] -sqldelight = ["sqldelight-android-driver", "sqldelight-coroutines", "sqldelight-android-paging"] +sqldelight = ["sqldelight-androidx-driver", "sqldelight-coroutines", "sqldelight-android-paging"] voyager = ["voyager-navigator", "voyager-screenmodel", "voyager-tab-navigator", "voyager-transitions"] test = ["junit-jupiter", "kotest-assertions", "mockk"] markdown = ["markdown-core", "markdown-coil"]